172 votes

Comment trier un ensemble en une liste en Java ?

En Java, j'ai un Set et je veux le transformer en un fichier trié. List . Existe-t-il une méthode dans le java.util.Collections un logiciel qui fera cela pour moi ?

218voto

erickson Points 127945

La réponse fourni par l'OP n'est pas le meilleur. Elle est inefficace, car elle crée une nouvelle List et un nouveau tableau inutile. De plus, cela soulève des avertissements "non vérifiés" en raison des problèmes de sécurité de type autour des tableaux génériques.

Au lieu de cela, utilisez quelque chose comme ceci :

public static
<T extends Comparable<? super T>> List<T> asSortedList(Collection<T> c) {
  List<T> list = new ArrayList<T>(c);
  java.util.Collections.sort(list);
  return list;
}

Voici un exemple d'utilisation :

Map<Integer, String> map = new HashMap<Integer, String>();
/* Add entries to the map. */
...
/* Now get a sorted list of the *values* in the map. */
Collection<String> unsorted = map.values();
List<String> sorted = Util.asSortedList(unsorted);

3 votes

Merci ! Ce SuppressWarnings m'a toujours dérangé.

0 votes

@erickson où je dois trouver la classe Util, je veux dire à partir de quel paquet, s'il vous plaît aidez-moi.

4 votes

@sunleo Le Util est celle qui contient la classe asSortedList() méthode que j'ai écrite. En d'autres termes, vous écrivez le Util vous-même, et mettez ce code dedans.

77voto

Steve B. Points 23227

Ensemble trié :

return new TreeSet(setIWantSorted);

ou :

return new ArrayList(new TreeSet(setIWantSorted));

0 votes

C'est ce que j'ai pensé en premier, mais le demandeur voulait une liste.

0 votes

@Alex : Cette approche peut encore être utilisée ; return new ArrayList(new TreeSet(setIWantSorted))

1 votes

J'ai en fait utilisé cette solution, mais je ne la conseille pas. Comme l'indique la documentation sur TreeSet (voir download.oracle.com/javase/1.4.2/docs/api/java/util/ ), il utilise effectivement la méthode compareTo() au lieu de la méthode equals(). Ainsi, si vous avez deux objets dans l'ensemble qui ont le même résultat equals(), ils seront considérés comme des doublons et, en tant que tels, ne seront pas ajoutés à l'ensemble TreeSet. Attention.

44voto

Esko Points 15578
List myList = new ArrayList(collection);
Collections.sort(myList);

devrait cependant faire l'affaire. Ajoutez de la saveur avec des génériques, le cas échéant.

0 votes

J'avais un extrait utile dont je voulais faire don à la communauté. Lorsque j'ai cherché l'information, je ne l'ai pas trouvée. J'essayais de faciliter le travail de la personne suivante. stackoverflow.com/questions/18557/

1 votes

Oui, bien sûr, mais le lien que vous avez fourni parle en fait d'un réel (c'est-à-dire celles pour lesquelles vous n'avez pas la réponse, alors trouvez-la). Votre question ici était seulement de donner la réponse... En fait, je pourrais saisir des centaines de questions et y répondre moi-même ; ce n'est pas le but !

5 votes

@Seb : Je ne suis pas d'accord. Je ne vois rien de mal dans cette question. Il est évident que ce n'était pas une question extrêmement simple, et maintenant il connaît une meilleure façon de faire qu'avant !

9voto

Satheesh Cheveri Points 1917

Il est toujours prudent d'utiliser l'interface Comparator ou Comparable pour mettre en œuvre le tri (si l'objet n'est pas une chaîne de caractères ou des classes enveloppes pour les types de données primitifs). Voici un exemple d'implémentation d'un comparateur pour trier les employés en fonction de leur nom

    List<Employees> empList = new LinkedList<Employees>(EmpSet);

    class EmployeeComparator implements Comparator<Employee> {

            public int compare(Employee e1, Employee e2) {
                return e1.getName().compareTo(e2.getName());
            }

        }

   Collections.sort(empList , new EmployeeComparator ());

Le comparateur est utile lorsque vous avez besoin d'un algorithme de tri différent pour un même objet (par exemple le nom d'un employé, son salaire, etc.). Le tri en mode unique peut être implémenté en utilisant l'interface Comparable dans l'objet requis.

5voto

Jeremy Stein Points 8343

Il n'existe pas de méthode unique pour le faire. Utilisez ceci :

@SuppressWarnings("unchecked")
public static <T extends Comparable> List<T> asSortedList(Collection<T> collection) {
  T[] array = collection.toArray(
    (T[])new Comparable[collection.size()]);
  Arrays.sort(array);
  return Arrays.asList(array);
}

0 votes

Il existe également une fonction Collections.sort, mais je pense qu'elle fait la même chose. +1 en tout cas.

1 votes

Collections.sort prend une liste comme paramètre.

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