Comment trier une liste de tableaux?
J'ai une Liste de doubles en java et je veux ArrayList dans l'ordre décroissant.
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);
La sortie devrait ressembler à ceci
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
Vous devez vous connecter pour publier un commentaire.
Qui permettra de faire ce que vous voulez. N'oubliez pas d'importer
Collections
si!Voici la documentation de
Collections
.Comparator
🙂Double
s.reverse
, mais le tri décroissant pourrait être plus rapide que le tri ascendant puis inverser. En outre, à l'aide d'une Liste de mise en œuvre qui prend en chargeComparator
comme argument du constructeur (donc garder invariant) permettra de s'assurer que la liste est triée en tout temps.Collections.sort
utilisecompareTo
derrière les coulisses.Collections.sort(list, Collections.reverseOrder());
. En plus d'être plus idiomatique (et peut-être plus efficace), en utilisant l'ordre inverse comparateur permet de s'assurer que le tri est stable (ce qui signifie que l'ordre des éléments ne seront pas changés lorsqu'ils sont égaux selon le traitement de référence, tandis que l'inversion va changer l'ordre).locationDetails.sort(Comparator.comparingInt(locationDetail -> locationDetail.getSnapshot().getQuantity()));
Collections.reverse(locationDetails);
voilà comment j'ai fait, mais est-il effiecient?Décroissant:
CustomData
estList<AnotherModel>
quiAnotherModel
aid
et je veux trier parid
? Et je viens de l'accès àCustomData
modèle dans ma classe.Utilisation util méthode de java.util.Collections classe, j'.e
En fait, si vous voulez trier objet personnalisé vous pouvez utiliser
voir les collections de l'api
Pour votre exemple, c'est faire de la magie dans Java 8
Mais si vous souhaitez trier par certains des champs de l'objet que vous le tri, vous pouvez le faire facilement par:
ou
ou
Sources: https://docs.oracle.com/javase/8/docs/api/java/util/Comparator.html
testList
? Je ne peux pas voir un zéro-argsort()
surList<>
ouIterable<>
.testList.stream().sorted
est qu'il crée une triés copier de la liste en une seule ligne. Ceci est pratique si vous ne voulez pas changer l'ordre de la liste d'originestream()
exemple nécessite.collect(Collectors.toList())
à la fin pour terminer l'opération.testList.stream().sorted
, il est plus utile si vous faites un peu d'autres opérations autres que le tri, vous pouvez ouvrir un flux et de le faire ensemble, plutôt que de le faire dans deux opérations différentes.À l'aide de lambda (Java8), et à la déshabiller pour le plus strict de la syntaxe (la JVM va conclure beaucoup dans ce cas), vous obtenez:
Une version plus détaillée:
L'utilisation d'un lambda est possible parce que le Comparateur interface n'a qu'une seule méthode à mettre en œuvre, de sorte que la VM peut en déduire la méthode est mise en œuvre. Depuis les types de paramètres peuvent être déduits, ils n'ont pas besoin d'être déclaré (c'est à dire
(a, b)
au lieu de(Double a, Double b)
. Et puisque le corps de lambda n'a qu'une seule ligne, et la méthode est censée renvoyer une valeur, lareturn
est déduit et les accolades ne sont pas nécessaires.Avec Java8 il y a une méthode de tri par défaut sur la Liste de l'interface qui va vous permettre de trier la collection si vous fournissez un Comparateur. Vous pouvez facilement trier les exemple dans la question comme suit:
Remarque: les arguments dans le lambda sont échangées lors de passée dans à Double.comparer afin d'assurer le tri est décroissant
locationDetails.sort((locationDetailAsc,locationDetailsDsc) -> Long.compare(locationDetailsDsc.getSnapshot().getQuantity(), locationDetailAsc.getSnapshot().getQuantity()));
Vous pouvez utiliser
Collections.sort(list)
pour trierlist
si votrelist
contientComparable
éléments. Sinon, je vous recommande de mettre en œuvre cette interface comme ici:et bien sûr de fournir votre propre réalisation de
compareTo
méthode comme ici:Et puis vous pouvez à nouveau utiliser
Colection.sort(list)
que maintenant la liste contient des objets de type Comparable et peuvent être triées. L'ordre dépend decompareTo
méthode. Cochez cette https://docs.oracle.com/javase/tutorial/collections/interfaces/order.html pour de plus amples informations.Collections.sort
vous permet de passer d'une instance d'unComparator
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
afin de trier la liste dans l'ordre inverse:Comme mentionné par @Marco13, en plus d'être plus idiomatique (et peut-être plus efficace), en utilisant l'ordre inverse comparateur permet de s'assurer que le tri est stable (ce qui signifie que l'ordre des éléments ne seront pas changés lorsqu'ils sont égaux selon le traitement de référence, tandis que l'inversion va changer l'ordre)
si vous utilisez Java SE 8, alors ce pourrait être de l'aide.
Collections.reverseOrder()
sans arguments, ce qui rend votre mise en œuvre decompareDouble
superflu (il est équivalent à l'ordre naturel desDouble
s). Ici, la réponse devrait êtreCollections.sort(testList, Collections.reverseOrder());
|*| Tri d'une Liste :
|=> Tri Asc Ordre :
|=> Trier Dsc Ordre :
|*| Inverser l'ordre de la Liste :
Vous pouvez le faire comme ceci:
Collection a un défaut de Comparaison qui peut vous aider avec ça.
Aussi, si vous souhaitez utiliser certaines de Java 8 de nouvelles fonctionnalités, vous pouvez le faire comme ça:
Par exemple, j'ai une Personne de la classe: String nom, int age ==>Constructeur new Personne(nom,age)
if you want to short by name
->if you want to sort by name
Vous pouvez l'utiliser comme ça
Dans JAVA 8 son beaucoup plus facile maintenant.
-- Pour inverser utiliser cette
Avec Eclipse Collections vous pouvez créer une primitive double liste, trier et puis d'inverser le mettre dans l'ordre décroissant. Cette approche permettrait d'éviter la boxe le double.
Si vous voulez un
List<Double>
, puis le suivant serait de travailler.Si vous souhaitez conserver le type de
ArrayList<Double>
, vous pouvez l'initialiser et le tri de la liste à l'aide de laArrayListIterate
classe utilitaire comme suit:Remarque: je suis un committer pour Eclipse Collections.
La ligne suivante doit faire l'épaisse
Voici une courte triche qui couvre les cas typiques: