Java compareTo pour la Chaîne et les arguments Entiers
Je suis la mise en œuvre de l'algorithme de tri bubble et je veux qu'il soit en mesure d'accepter les deux Integer
et String
paramètres. J'ai jeté toutes les entrées comme des Chaînes de caractères et utiliser le compareTo
méthode pour comparer les nombres entiers coulé comme des chaînes de caractères les chaînes de caractères. Je reçois une réponse incorrecte lors de l'utilisation de compareTo
de comparer les commentée des entiers. Ce que je fais mal?
OriginalL'auteur | 2009-05-23
Vous devez vous connecter pour publier un commentaire.
Entier.compareTo trie les nombres en chiffres. C'est ce que vous voulez.
Chaîne.compareTo trie les chaînes de manière lexicographique; c'est, dans l'ordre alphabétique.
Je me souviens dans Windows 3.1 le dossier de photos de mon appareil photo numérique a été commandé, comme ceci: PHOTO1, PHOTO10, PHOTO100, PHOTO2, PHOTO20, PHOTO3, ... et ainsi de suite. Windows XP trie plus que vous attendez: PHOTO1, PHOTO2, PHOTO3, ... etc. C'est parce qu'il a des règles de tri pour les chaînes de caractères qui représentent des nombres.
Dans le vocabulaire de la commande, chaque caractère dans une chaîne Un est par rapport à la correspondante de caractères dans une autre chaîne B. Pour chaque caractère correspondant dans les deux chaînes:
Le quatrième point ici, c'est pourquoi vous obtenez les réponses incorrectes, en supposant que Eddie analyse de votre problème est correct.
Considérer les chaînes "10" et "2". Vocabulaire de la commande serait de regarder les premiers caractères de chaque, '1' et '2', respectivement. Le caractère '1' avant '2' dans le jeu de caractères que Java utilise, donc il trie "10" avant "2", de la même manière que "nu" est trié avant de "lièvre" parce que " b "vient avant "h".
Je vous suggère de jeter vos chaînes en nombres entiers avant de les trier. Utilisez Entier.parseString pour ce faire.
Belle Réponse avec bel exemple.
OriginalL'auteur Iain Samuel McLean Elder
êtes-vous sûr que vous voulez mélanger des Entiers et des Chaînes de caractères dans la même liste? si oui, sont des nombres Entiers de moins ou de plus que les Chaînes? qu'est-ce que ce particulier, des critères de tri?
vous pouvez également faire un tri à bulles, une méthode de sortes distinctes de listes d'Entiers et les listes de Chaîne (et de listes de toutes les autres classes). pour ce faire, vous pouvez utiliser des Génériques. par exemple:
vous utilisez le
comparator
paramètre de comparer leselements
, c'est pourquoi ils peuvent être des Entiers ou des Chaînes de caractères (pas les deux en même temps). le compilateur ne vous laisse pas [sans aucun avertissement] passer d'une liste d'objets d'une classe et d'un comparateur d'une classe différente, de sorte que la comparaison sera toujours.OriginalL'auteur cd1
Prendre un exemple de
Comparable
.Les chaînes ne peuvent pas vraiment être exprimées en nombres entiers, et il n'y a pas de comparryo méthode.
OriginalL'auteur Jeremy Huiskamp
Ce que vous décrivez n'est pas vraiment possible... alors peut-être vous avez besoin de poster le code. Voici mon interprétation de la wht vous êtes en train de faire:
La documentation pour compareTo est ici, vous devriez vraiment respecter le contrat.
OriginalL'auteur TofuBeer
Tout d'abord, vous voulez Comparateur pas Comparable parce Comparateur prend deux objets, alors que Comparable compare l'objet d'un passé et vous ne pouvez pas changer le compareTo() la méthode sur Chaîne ou un Entier donc:
Voilà comment j'ai lu la question: il veut comparer des nombres entiers comme des chaînes de caractères. Si il veut automatiquement convertir des chaînes en nombres entiers et de les comparer numériquement, c'est évidemment différent.
OriginalL'auteur cletus
En supposant que ce que tu veux vraiment dire, c'est que vous êtes la conversion des Entiers à Cordes, et en comparant ensuite, cela ne fonctionnera pas. Par exemple, disons que vous avez l'Entier
1234
et l'Entier1
et l'Entier2
. Si vous convertissez ces Chaînes et de les comparer entre eux, vous obtiendrez la commande:ce qui est correct pour ASCII de tri et incorrectes pour les tri. C'est, je suppose que votre code n'quelque chose comme ceci:
Pourquoi dois-je suppose? Parce que vous parlez d'un résultat incorrect et ne parlons pas d'obtenir des Exceptions. Si vous êtes réellement obtenir des Exceptions, puis les autres affiches sont corrects que la conversion ne fonctionne pas.
OriginalL'auteur Eddie
C'est parce que de API java code dans
String
classe où la longueur minimale des caractères entre les deux chaînes de caractères ne sont comparés.Si nous utilisons cette api vous permet de comparer
sera de retour négatif valeur en disant: ABCD est à moins de ABZ signifie que C est moins de Z et ignoré D dans la première Chaîne.
Alors peut-être que nous avons besoin de quelque chose comme ci-dessous
OriginalL'auteur Kanagavelu Sugumar