J'ai une liste de doubles en java et je veux trier ArrayList dans l'ordre décroissant.
Input 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 comme ça
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
java
sorting
arraylist
collections
Himanshu
la source
la source
Comparator
:)Double
s.reverse
, mais le tri décroissant pourrait en fait être plus rapide que le tri ascendant puis l'inverse. De plus, l'utilisation d'une implémentation List qui prendComparator
en charge comme argument constructeur (la gardant ainsi invariante) garantirait que la liste est triée à tout moment.Collections.sort
utilisecompareTo
dans les coulisses.Collections.sort(list, Collections.reverseOrder());
. En plus d'être plus idiomatique (et peut-être plus efficace), l'utilisation du comparateur d'ordre inverse garantit que le tri est stable (ce qui signifie que l'ordre des éléments ne sera pas changé lorsqu'ils sont égaux selon le comparateur, alors que l'inversion changera l'ordre ).Descendant:
la source
CustomData
c'estList<AnotherModel>
quiAnotherModel
aid
et je veux trier parid
? Et je viens d'accéder auCustomData
modèle dans ma classe.Integer.compare(rhs.customInt, lhs.customInt);
Utilisez la méthode util de la classe java.util.Collections , c.-à-d.
En fait, si vous souhaitez trier un objet personnalisé, vous pouvez utiliser
voir les collections api
la source
Pour votre exemple, cela fera la magie de Java 8
Mais si vous souhaitez trier par certains des champs de l'objet que vous triez, vous pouvez le faire facilement en:
ou
ou
Sources: https://docs.oracle.com/javase/8/docs/api/java/util/Comparator.html
la source
En utilisant lambdas (Java8) et en le dépouillant de la syntaxe la plus simple (la JVM en déduira beaucoup dans ce cas), vous obtenez:
Une version plus verbeuse:
L'utilisation d'un lambda est possible car l'interface du comparateur n'a qu'une seule méthode à implémenter, de sorte que la machine virtuelle peut déduire quelle méthode implémente. Étant donné que les types de paramètres peuvent être déduits, ils n'ont pas besoin d'être indiqués (c'est-
(a, b)
à- dire au lieu de(Double a, Double b)
. Et puisque le corps lambda n'a qu'une seule ligne, et que la méthode devrait renvoyer une valeur, lereturn
est inféré et les accolades ne sont pas nécessaires.la source
Avec Java8, il existe une méthode de tri par défaut sur l'interface List qui vous permettra de trier la collection si vous fournissez un comparateur. Vous pouvez facilement trier l'exemple de la question comme suit:
Remarque: les arguments dans le lambda sont échangés lorsqu'ils sont transmis à Double.compare pour garantir que le tri est décroissant
la source
locationDetails.sort((locationDetailAsc,locationDetailsDsc) -> Long.compare(locationDetailsDsc.getSnapshot().getQuantity(), locationDetailAsc.getSnapshot().getQuantity()));
Vous pouvez utiliser
Collections.sort(list)
pour trierlist
si votrelist
contient desComparable
éléments. Sinon, je vous recommanderais d'implémenter cette interface comme ici:et bien sûr fournir votre propre réalisation de
compareTo
méthode comme ici:Et puis vous pouvez à nouveau utiliser
Colection.sort(list)
comme maintenant la liste contient des objets de type comparable et peut être triée. L'ordre dépend de lacompareTo
méthode. Consultez ce https://docs.oracle.com/javase/tutorial/collections/interfaces/order.html pour des informations plus détaillées.la source
Collections.sort
vous permet de passer une instance de aComparator
qui définit la logique de tri. Ainsi, au lieu de trier la liste dans l'ordre naturel puis de l'inverser, on peut simplement passerCollections.reverseOrder()
àsort
pour trier la liste dans l'ordre inverse:Comme mentionné par @ Marco13, en plus d'être plus idiomatique (et peut-être plus efficace), l'utilisation du comparateur d'ordre inverse garantit que le tri est stable (ce qui signifie que l'ordre des éléments ne sera pas modifié lorsqu'ils sont égaux selon le comparateur, alors que l'inversion changera l'ordre)
la source
la source
Voici un petit cheatsheet qui couvre des cas typiques:
la source
si vous utilisez Java SE 8, cela peut être utile.
la source
Collections.reverseOrder()
sans aucun argument, ce qui rend votre implémentation decompareDouble
superflu (c'est équivalent à l'ordre naturel deDouble
s). La réponse ici devrait êtreCollections.sort(testList, Collections.reverseOrder());
| * | Tri d'une liste:
| => Ordre de tri asc:
| => Trier l'ordre Dsc:
| * | Inversez l'ordre de la liste:
la source
Vous pouvez faire comme ça:
La collection a un comparateur par défaut qui peut vous aider avec cela.
De plus, si vous souhaitez utiliser certaines nouvelles fonctionnalités de Java 8, vous pouvez faire comme ça:
la source
Par exemple, j'ai une classe Person: String name, int age ==> Constructor new Person (name, age)
la source
if you want to short by name
->if you want to sort by name
Dans JAVA 8, c'est beaucoup plus facile maintenant.
- Pour une utilisation inverse,
la source
Vous pouvez utiliser comme ça
la source
Avec Eclipse Collections, vous pouvez créer une double liste primitive, la trier puis l'inverser pour la mettre dans l'ordre décroissant. Cette approche éviterait de boxer les doubles.
Si vous voulez un
List<Double>
, alors ce qui suit fonctionnerait.Si vous souhaitez conserver le type sous
ArrayList<Double>
, vous pouvez initialiser et trier la liste à l'aide de laArrayListIterate
classe utilitaire comme suit:Remarque: je suis un committer pour les collections Eclipse .
la source
La ligne suivante devrait faire l'épaisseur
la source