J'essaie de trier une arrayliste de chaînes qui représentent des valeurs de carte. Ainsi, certaines cartes contiennent des lettres ("roi") et certaines contiennent des chaînes contenant uniquement un nombre ("7"). Je sais utiliser des collections.sort, mais il trie uniquement des chaînes contenant des lettres. Comment puis-je obtenir le triyliste pour être trié par numéro ainsi que par ordre alphabétique? P>
Edit: Désolé, je ne dois pas avoir beaucoup d'attention lorsque j'ai examiné le tri. Le tri fonctionne correctement, je dois juste avoir été jeté par le fait qu'un 10 viendra avant un 2. Merci P>
5 Réponses :
Non, Collections.sort Code> Triera tout, en utilisant une comparaison lexicographique ordinale unicode, car c'est le comportement de
string.careto code>
. "7" viendra avant "roi" et "10" viendra avant "2". P>
Yep -
je sais utiliser des collections.sort, mais il trie uniquement les chaînes contenant des lettres. Comment puis-je obtenir le tri par numéro par numéro ainsi que par ordre alphabétique? Em> p>
Si la chaîne est un chiffre, il est déjà trié (comme une chaîne si) look: p>
xxx pré> impression p>
xxx pré> Est-ce ce dont vous avez besoin? p>
EDIT FORT> P> supposant (deviner) ce dont vous avez besoin est de trier un jeu de cartes, qui ont des chiffres et des "lettres" (J, Q, K, a) Vous pouvez essayer d'utiliser un comparateur personnalisé. P>
Voici celui qui prend en compte les chiffres "comme des chiffres" le reste comme des chaînes, "10" vient après "2" mais avant " Kings " P>
class Card implements Comparable<Card> { public int compareTo( Card other ) { // add custom logic to compare one card with other } }
Ce n'est pas ce qu'il demande. Je pense qu'il veut que vous écriviez un comparateur personnalisé pour tous les noms de cartes.
@Nikita: Je comprends qu'il "pense", les chiffres ne comprennent pas dans le type. L'OP a probablement besoin de clarification.
Trier triera tout selon vos caractères. En d'autres mots, tous les numéros vont venir avant les lettres de l'ordre lexicographique. Par exemple, les nombres décimaux commencent par un "." et hors de l'ordre lexicographiquement.
Si vous souhaitez modifier cela, faites un objet comparateur. Vous pouvez ensuite mettre les articles dans n'importe quel ordre que vous aimez. P>
Par exemple, cela trier les numéros dans l'ordre numérique, ainsi que des mots dans l'ordre lexical: p>
Comme @jon Skeet dit, le tri intégré comparera basé sur des valeurs Unicode. Vous devriez écrire votre propre méthode de tri. P>
Tant que vous écrivez votre propre code, cela pourrait-il suggérer une énumération? Un pont de cartes est l'un des exemples canoniques d'utilisation d'énums. La version courte est que vous pouvez déclarer votre propre ordre de tri pour un groupe de choses; Vous pourriez même rendre le roi des piques survivre au roi des diamants, si vous le souhaitez. Découvrez le tutoriel ici . P>
Si je comprends bien, vous avez un tableau comme Je recommanderais de le rendre un peu plus orienté objet, c'est-à-dire Créer une carte de classe avec des champs Nom et valeur: P> ["7", "reine", "9", "6"] code> et vous voulez qu'il ressemble à
["reine" , "9", "7", "6"] code> (ou dans l'ordre inverse) après le tri est effectué.
Card six = new Card("6", 6);
Card ten = new Card("10", 10);
Card queen = new Card("Queen", 12);
nitpick> code>
"Je sais utiliser des collections.sort, mais il trie uniquement des chaînes contenant des lettres" euh?
Je ne sais pas ce que vous essayez de faire, trier la collection triera tout (y compris "7") par ordre alphabétique. Les chiffres sont placés avant un, de sorte qu'ils se retrouveraient sur le dessus. Si vous souhaitez que 7 soit stocké sous "S", vous devez créer un dictionnaire avec quelque chose comme la classe de dictionnaire de collections génériques, qui a la chaîne d'affichage "7" ainsi que la représentation de code / texte "Seven", ou quelque chose comme cette.