web-dev-qa-db-fra.com

Comment trier un ensemble sur une liste en Java?

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

163
Jeremy Stein

La réponse fournie par l'OP n'est pas la meilleure. Il est inefficace car il crée un nouveau List et un nouveau tableau inutile. En outre, il génère des avertissements "non contrôlés" en raison des problèmes de sécurité liés aux types de 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);
212
erickson

Ensemble trié:

return new TreeSet(setIWantSorted);

ou:

return new ArrayList(new TreeSet(setIWantSorted));
73
Steve B.
List myList = new ArrayList(collection);
Collections.sort(myList);

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

43
Esko

Voici comment vous pouvez le faire avec les flux de Java 8:

mySet.stream().sorted().collect(Collectors.toList());

ou avec un comparateur personnalisé:

mySet.stream().sorted(myComparator).collect(Collectors.toList());
38
nschum

Il est toujours prudent d’utiliser l’interface Comparator ou Comparable pour assurer la mise en œuvre du tri (si l’objet n’est pas une classe String ou Wrapper pour les types de données primitifs). Par exemple, pour une implémentation de comparateur permettant de trier les employés en fonction du 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 devez avoir un algorithme de tri différent sur le même objet (nom emp, nom, salaire, etc.). Le tri en mode simple peut être mis en œuvre à l'aide de l'interface Comparable vers l'objet requis.

9
Satheesh Cheveri

Il n'y a 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);
}
5
Jeremy Stein

Vous pouvez convertir un ensemble en un fichier ArrayList, où vous pouvez trier le ArrayList à l'aide de Collections.sort(List).

Voici le code:

keySet = (Set) map.keySet();
ArrayList list = new ArrayList(keySet);     
Collections.sort(list);
3
Amit

@ Jeremy Stein Je voulais implémenter le même code. De plus, je voulais trier l'ensemble de la liste, donc au lieu d'utiliser Set, j'ai converti les valeurs de l'ensemble en liste et trier cette liste en fonction de la variable. Ce code m'a aidé,

set.stream().sorted(Comparator.comparing(ModelClassName::sortingVariableName)).collect(Collectors.toList());
2
Deepak Kumbhar
TreeSet sortedset = new TreeSet();
sortedset.addAll(originalset);

list.addAll(sortedset);

où originalalset = ensemble non trié et list = la liste à renvoyer

2
Sujith Mohan