41 votes

Tri des valeurs d'un ensemble

J'essaie de trier les éléments d'un ensemble mais je n'y suis pas parvenu jusqu'à présent. Voici le code que j'essaie 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 cette méthode ou une autre ne fonctionne pas car elle me donne toujours le même ordre dans lequel ils ont été remplis. 12,15,5

70voto

Sean Patrick Floyd Points 109428

Utilisez un SortedSet (TreeSet est celui par défaut) :

SortedSet<String> set=new TreeSet<String>();
set.add("12");
set.add("15");
set.add("5");
List<String> list=new ArrayList<String>(set);

Aucun code de tri supplémentaire n'est nécessaire.

Oh, je vois que vous voulez un ordre de tri différent. Fournissez un comparateur au TreeSet :

new TreeSet<String>(Comparator.comparing(Integer::valueOf));

Maintenant, votre TreeSet triera les chaînes en ordre numérique (ce qui implique qu'il lèvera des exceptions si vous fournissez des chaînes non numériques).

Référence :

31voto

mikej Points 30224

Si vous triez les chaînes de caractères "12" , "15" y "5" entonces "5" vient en dernier parce que "5" > "1" . c'est-à-dire que l'ordre naturel des chaînes de caractères ne fonctionne pas comme vous le souhaitez.

Si vous voulez stocker des chaînes de caractères dans votre liste mais les trier numériquement, vous devrez utiliser un comparateur qui gère cela, par exemple.

Collections.sort(list, new Comparator<String>() {
    public int compare(String o1, String o2) {
        Integer i1 = Integer.parseInt(o1);
        Integer i2 = Integer.parseInt(o2);
        return (i1 > i2 ? -1 : (i1 == i2 ? 0 : 1));
    }
});

De plus, je pense que vous confondez légèrement entre Collection types. A HashSet y un HashMap sont des choses différentes.

8voto

Matt Ball Points 165937

Vous utilisez le comparateur par défaut pour trier un fichier Set<String> . Dans ce cas, cela signifie ordre lexicographique . Lexicographiquement, "12" vient avant "15" vient avant "5" .

Soit utiliser un Set<Integer> :

Set<Integer> set=new HashSet<Integer>();
set.add(12);
set.add(15);
set.add(5);

Ou utiliser un autre comparateur :

Collections.sort(list, new Comparator<String>() {
    public int compare(String a, String b) {
        return Integer.parseInt(a) - Integer.parseInt(b);
    }
});

4voto

dimitrisli Points 5203

Utilisez le Integer au lieu de String car elle fait le travail pour vous en implémentant Comparable<Integer> . Ensuite, java.util.Collections.sort(list); ferait l'affaire.

1voto

Jonathon Faust Points 7543

Les chaînes de caractères sont triées lexicographiquement . Le comportement que vous observez est correct.

Définir votre propre comparateur pour trier les chaînes de caractères comme vous le souhaitez.

Cela fonctionnerait également comme vous l'attendez (5 comme premier élément) si vous changiez vos collections en Integer au lieu d'utiliser String.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X