Comment trier ArrayList <Long> par ordre décroissant?

98

Comment trier un ArrayList<Long>en Java par ordre décroissant?

Tamara
la source

Réponses:

240

Voici un moyen pour votre list:

list.sort(null);
Collections.reverse(list);

Ou vous pouvez implémenter le vôtre Comparatorpour trier et éliminer l'étape inverse:

list.sort((o1, o2) -> o2.compareTo(o1));

Ou encore plus simplement utiliser Collections.reverseOrder()puisque vous ne faites qu'inverser:

list.sort(Collections.reverseOrder());
WhiteFang34
la source
6
l1 > l2 ? -1 : l1 == l2 ? 0 : 1ce code est ridicule. Utilisez o1.compareTo(o2)alors.
ilalex
4
@ilya: oh ouais, bon point, mais il doit être o2.compareTo(o1)ici :)
WhiteFang34
2
list.sort (Collections.reverseOrder ());
tunix
list.sort((o1, o2) -> o2.compareTo(o1))
Bravo
27
Comparator<Long> comparator = Collections.reverseOrder();
Collections.sort(arrayList, comparator);
Umesh K
la source
Uniquement avec un argument générique sur cette déclaration de variable.
Tom Hawtin - tackline
18

Vous pouvez utiliser le code suivant qui est donné ci-dessous;

Collections.sort(list, Collections.reverseOrder());

ou si vous allez utiliser un comparateur personnalisé, vous pouvez utiliser comme indiqué ci-dessous

Collections.sort(list, Collections.reverseOrder(new CustomComparator());

Où CustomComparator est une classe de comparaison qui compare l'objet présent dans la liste.

Balasubramanian Jayaraman
la source
10

Java 8

bien faire cela en java 8 est tellement amusant et plus facile

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

Les expressions lambda rockent ici !!!

au cas où vous auriez besoin d'une logique de plus d'une ligne pour comparer a et b, vous pourriez l'écrire comme ceci

Collections.sort(variants,(a,b)->{
    int result = a.compareTo(b);
    return result;
});
azerafati
la source
1
Je pense que si nous changeons cela en b.compareTo (a), nous n'aurons pas besoin d'inverser la collection.
zawhtut
@zawhtut, totalement vrai! vient de mentionner reverse () pour que vous connaissiez les options, le choix vous
appartient
Devez-vous convertir long en long?
BluE
3

Pour les lamdas où votre valeur longue est quelque part dans un objet, je recommande d'utiliser:

.sorted((o1, o2) -> Long.compare(o1.getLong(), o2.getLong()))

ou encore mieux:

.sorted(Comparator.comparingLong(MyObject::getLong))
Bleu
la source
2

Trier, puis inverser.

user541686
la source
2

Une approche plus générale pour implémenter notre propre comparateur comme ci-dessous

Collections.sort(lst,new Comparator<Long>(){
                public int compare(Long o1, Long o2) {
                    return o2.compareTo(o1);
                }
            });
josephj1989
la source
1

En utilisant Collections.sort()avec un comparateur qui fournit l'ordre décroissant. Voir Javadoc pour Collections.sort .

Heiko Rupp
la source
1

L'approche suivante trier la liste par ordre décroissant et gère également les « nulles valeurs », juste au cas où si vous avez des valeurs nulles alors Collections.sort () jetteront NullPointerException

      Collections.sort(list, new Comparator<Long>() {
          public int compare(Long o1, Long o2) {
                  return o1==null?Integer.MAX_VALUE:o2==null?Integer.MIN_VALUE:o2.compareTo(o1);

        }
    });
Jagadeesh
la source
0

Vous pouvez également trier un ArrayListavec un TreeSetau lieu d'un comparator. Voici un exemple d'une question que j'avais auparavant pour un tableau d'entiers. J'utilise "nombres" comme nom d'espace réservé pour le ArrayList.


     import.java.util.*;
        class MyClass{
        public static void main(String[] args){
        Scanner input = new Scanner(System.in);
        ArrayList<Integer> numbers = new ArrayList<Integer>(); 

        TreeSet<Integer> ts = new TreeSet<Integer>(numbers);
        numbers = new ArrayList<Integer>(ts);
        System.out.println("\nThe numbers in ascending order are:");
        for(int i=0; i<numbers.size(); i++)
        System.out.print(numbers.get(i).intValue()+" ");
        System.out.println("\nThe numbers in descending order are:");
        for(int i=numbers.size()-1; i>=0; i--)
        System.out.print(numbers.get(i).intValue()+" ");
    }
}
009
la source
Mais TreeSetne stocke pas les valeurs en double.
0

Donc, il y a quelque chose que je voudrais soulever qui, à mon avis, est important et que vous devriez considérer. runtime et mémoire. Disons que vous avez une liste et que vous voulez la trier, eh bien, vous pouvez, il existe un tri intégré ou vous pouvez développer la vôtre. Ensuite, vous dites, voulez inverser la liste. Telle est la réponse qui est énumérée ci-dessus.

Si vous créez cette liste, il peut être bon d'utiliser une structure de données différente pour la stocker, puis de la vider dans un tableau.

Les tas font exactement cela. Vous filtrez les données et il gérera tout, puis vous pouvez tout retirer de l'objet et il serait trié.

Une autre option serait de comprendre le fonctionnement des cartes. Souvent, une carte ou un HashMap comme quelque chose que l'on appelle les choses, ont un concept sous-jacent.

Par exemple .... vous alimentez un tas de paires clé-valeur où la clé est la longue, et lorsque vous ajoutez tous les éléments, vous pouvez faire: .keyset il vous renverrait une liste triée automatiquement.

Cela dépend de la façon dont vous traitez les données avant de savoir comment je pense que vous devriez continuer votre tri et les inversions ultérieures.

Fallenreaper
la source
0

La méthode de comparaison du comparateur peut être utilisée pour comparer les objets, puis la méthode reversed()peut être appliquée pour inverser l'ordre -

list.stream().sorted(Comparator.comparing(Employee::getName).reversed()).collect(toList());
Amrendra
la source