458 votes

Comment trier une liste/un tableau ?

J'ai une liste de doubles en java et je veux trier ArrayList en ordre décroissant.

L'entrée ArrayList est comme ci-dessous :

List<Double> testList = new ArrayList();

testList.add(0.5);
testList.add(0.2);
testList.add(0.9);
testList.add(0.1);
testList.add(0.1);
testList.add(0.1);
testList.add(0.54);
testList.add(0.71);
testList.add(0.71);
testList.add(0.71);
testList.add(0.92);
testList.add(0.12);
testList.add(0.65);
testList.add(0.34);
testList.add(0.62);

Le résultat devrait être le suivant

0.92
0.9
0.71
0.71
0.71
0.65
0.62
0.54
0.5
0.34
0.2
0.12
0.1
0.1
0.1

2 votes

TestList.sort(Comparator.reverseOrder()) ;

666voto

Doorknob Points 23912
Collections.sort(testList);
Collections.reverse(testList);

Cela fera ce que vous voulez. N'oubliez pas d'importer Collections cependant !

Voici la documentation pour Collections .

74 votes

Il est peut-être utile de mentionner que vous pouvez définir votre propre Comparator :)

1 votes

@Polygnome L'OP ne fait que trier Double s.

5 votes

Oui, mais vous pouvez les trier de différentes manières, en fonction du cas d'utilisation. Parfois, vous pourriez vouloir les trier par distance par rapport à 0. Je ne sais même pas quelles sont les caractéristiques d'exécution de reverse mais le tri descendant pourrait en fait être plus rapide que le tri ascendant puis l'inversion. De plus, l'utilisation d'une implémentation de la liste qui prend en charge Comparator comme argument du constructeur (ce qui le rend invariant) garantirait que la liste est triée à tout moment.

177voto

bong jae choe Points 1397

Descendant :

Collections.sort(mArrayList, new Comparator<CustomData>() {
    @Override
    public int compare(CustomData lhs, CustomData rhs) {
        // -1 - less than, 1 - greater than, 0 - equal, all inversed for descending
        return lhs.customInt > rhs.customInt ? -1 : (lhs.customInt < rhs.customInt) ? 1 : 0;
    }
});

153voto

krmanish007 Points 1

Pour votre exemple, ceci fera la magie en Java 8

List<Double> testList = new ArrayList();
testList.sort(Comparator.naturalOrder());

Mais si vous voulez trier par certains des champs de l'objet que vous triez, vous pouvez le faire facilement :

testList.sort(Comparator.comparing(ClassName::getFieldName));

ou

 testList.sort(Comparator.comparing(ClassName::getFieldName).reversed());

ou

 testList.stream().sorted(Comparator.comparing(ClassName::getFieldName).reversed()).collect(Collectors.toList());

Sources : https://docs.oracle.com/javase/8/docs/api/java/util/Comparator.html

95voto

M Sach Points 6078

Utilisez la méthode utilitaire de java.util.Collections la classe, c'est-à-dire

Collections.sort(list)

En fait, si vous voulez trier un objet personnalisé, vous pouvez utiliser

Collections.sort(List<T> list, Comparator<? super T> c) 

voir l'api des collections

66voto

cyrus Points 601

En utilisant des lambdas (Java8), et en réduisant la syntaxe à sa plus simple expression (la JVM déduit abondance dans ce cas), vous obtenez :

Collections.sort(testList, (a, b) -> b.compareTo(a));

Une version plus verbeuse :

// Implement a reverse-order Comparator by lambda function
Comparator<Double> comp = (Double a, Double b) -> {
    return b.compareTo(a);
};

Collections.sort(testList, comp);

L'utilisation d'un lambda est possible car l'interface Comparator n'a qu'une seule méthode à implémenter, de sorte que la VM peut déduire quelle méthode est implémentée. Puisque les types des paramètres peuvent être déduits, ils n'ont pas besoin d'être indiqués (par exemple (a, b) au lieu de (Double a, Double b) . Et comme le corps du lambda ne comporte qu'une seule ligne, et que la méthode est censée renvoyer une valeur, la balise return est déduit et les accolades ne sont pas nécessaires.

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