Trier les Valeurs de Set
Je suis en train de trier les éléments d'un ensemble, mais incapable de le faire jusqu'à présent.
voici mon code, je suis en train de faire
public static void main(String [] args){
Set<String> set=new HashSet<String>();
set.add("12");
set.add("15");
set.add("5");
List<String> list=asSortedList(set);
}
public static
<T extends Comparable<? super T>> List<T> asSortedList(Collection<T> c) {
List<T> list = new ArrayList<T>(c);
Collections.sort(list);
return list;
}
mais l'une ou l'autre façon est de ne pas travailler depuis son tout le temps de me donner le même ordre dans lequel ils ont été remplis
12,15,5
- Un
Map
n'est pas unSet
. GRANDE différence! - Est-il une raison quelconque vous n'utilisez pas un SortedSet si vous voulez un ensemble trié?
Vous devez vous connecter pour publier un commentaire.
Si vous trier les chaînes
"12"
,"15"
et"5"
puis"5"
vient en dernier, car"5"
>"1"
. c'est à dire l'ordre naturel des Chaînes ne fonctionne pas de la façon que vous attendez.Si vous souhaitez stocker des chaînes de votre liste, mais les trier numériquement, alors vous aurez besoin d'utiliser un comparateur qui gère cela. par exemple,
Aussi, je pense que vous êtes l'obtention légèrement mélangés entre
Collection
types. UnHashSet
et unHashMap
sont des choses différentes.compare
méthodeo1 == o2
peut conduire à des résultats inattendus avec les non-internés des Chaînes de caractères. Utilisationo1.equals(o2)
(vous pouvez également faire deo1.intern()==o2.intern()
mais c'est horrible)parseInt
dans l'édition. J'ai révisé à nouveau.return i1.compareTo(i2);
?Utiliser un SortedSet (TreeSet est celui par défaut):
Sans supplément de tri code nécessaire.
Oh, je vois, vous voulez un ordre de tri différent. L'approvisionnement de Comparaison pour la TreeSet:
Maintenant votre TreeSet va trier les Chaînes dans l'ordre numérique (ce qui implique qu'il va lancer des exceptions si vous fournissez de la non-chaînes numériques)
Référence:
SortedSet
de l'interfaceTreeSet
Comparateur
Comparator
le constructeur deTreeSet
Vous utilisez la valeur par défaut comparateur de trier un
Set<String>
. Dans ce cas, cela signifie que l'ordre lexicographique. Lexicographiquement,"12"
vient avant"15"
, vient avant"5"
.Soit utiliser un
Set<Integer>
:Ou d'utiliser un autre élément de comparaison:
Utiliser le
Integer
classe wrapper au lieu de la Chaîne, car il est en train de faire le travail dur pour vous par la mise en œuvre deComparable<Integer>
. Puisjava.util.Collections.sort(list);
ferait l'affaire.Les chaînes sont triés de manière lexicographique. Le comportement que vous voyez n'est correcte.
Définir votre propre comparateur de trier les chaînes toutefois vous préférez.
Il serait également fonctionner de la même manière que vous êtes enceinte (5 comme le premier élément) si vous avez changé de collections entières, au lieu de l'aide de la Chaîne.
Vous besoin de passer par un Comparateur exemple de la méthode de tri sinon les éléments seront triés dans leur ordre naturel.
Pour plus d'informations, consultez Les Collections.de tri(Liste, Comparateur)