Bagaimana mengurutkan ArrayList <Long> dalam urutan menurun?


98

Bagaimana cara mengurutkan ArrayList<Long>di Jawa dalam urutan menurun?

Jawaban:


240

Inilah salah satu cara untuk Anda list:

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

Atau Anda dapat menerapkan sendiri Comparatoruntuk menyortir dan menghilangkan langkah sebaliknya:

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

Atau bahkan lebih mudah digunakan Collections.reverseOrder()karena Anda hanya membalik:

list.sort(Collections.reverseOrder());

6
l1 > l2 ? -1 : l1 == l2 ? 0 : 1kode ini konyol. Gunakan o1.compareTo(o2)kemudian.
ilalex

4
@ilya: oh ya, poin bagus, meskipun harus ada di o2.compareTo(o1)sini :)
WhiteFang34

2
list.sort (Collections.reverseOrder ());
tunix

Jempol untuklist.sort((o1, o2) -> o2.compareTo(o1))
arenaq

27
Comparator<Long> comparator = Collections.reverseOrder();
Collections.sort(arrayList, comparator);

Hanya dengan argumen generik pada deklarasi variabel itu.
Tom Hawtin - tackline

18

Anda dapat menggunakan kode berikut yang diberikan di bawah ini;

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

atau jika Anda akan menggunakan komparator khusus, Anda dapat menggunakan seperti yang diberikan di bawah ini

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

Dimana CustomComparator adalah kelas pembanding yang membandingkan objek yang ada dalam daftar.


10

Jawa 8

melakukan ini di java 8 jauh lebih menyenangkan dan lebih mudah

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

Ekspresi lambda bergoyang di sini !!!

jika Anda membutuhkan lebih dari satu logika baris untuk membandingkan a dan b Anda dapat menuliskannya seperti ini

Collections.sort(variants,(a,b)->{
    int result = a.compareTo(b);
    return result;
});

1
Saya rasa jika kita mengubahnya menjadi b.compareTo (a), kita tidak perlu membalikkan koleksi.
zawhtut

@zawhtut, benar-benar benar! baru saja menyebutkan reverse () sehingga Anda tahu opsinya, pilihan ada di tangan Anda
azerafati

Apakah Anda harus mengubah panjang menjadi panjang?
BluE


3

Untuk lamda di mana nilai panjang Anda berada di suatu tempat di suatu objek, saya sarankan menggunakan:

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

atau bahkan lebih baik:

.sorted(Comparator.comparingLong(MyObject::getLong))


2

Pendekatan yang lebih umum untuk mengimplementasikan Pembanding kita sendiri seperti di bawah ini

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


1

Pendekatan berikut akan mengurutkan daftar dalam urutan menurun dan juga menangani nilai ' null ', untuk berjaga-jaga jika Anda memiliki nilai null, Collections.sort () akan menampilkan 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);

        }
    });

0

Anda juga dapat mengurutkan ArrayListdengan a, TreeSetbukan dengan a comparator. Berikut adalah contoh dari pertanyaan yang saya miliki sebelumnya untuk array integer. Saya menggunakan "angka" sebagai nama placeholder untuk 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()+" ");
    }
}

Tapi TreeSettidak menyimpan nilai duplikat.

0

Jadi, ada sesuatu yang ingin saya kemukakan yang menurut saya penting dan menurut saya harus Anda pertimbangkan. runtime dan memori. Katakanlah Anda memiliki daftar dan ingin menyortirnya, Anda bisa, ada semacam bawaan atau Anda bisa mengembangkannya sendiri. Lalu Anda berkata, ingin membalik daftar. Itulah jawaban yang tercantum di atas.

Jika Anda membuat daftar itu, mungkin lebih baik menggunakan struktur data yang berbeda untuk menyimpannya dan kemudian membuangnya ke dalam array.

Heaps melakukan ini. Anda memfilter data, dan itu akan menangani semuanya, lalu Anda dapat mengeluarkan semuanya dari objek dan itu akan disortir.

Pilihan lainnya adalah memahami cara kerja peta. Seringkali, Map atau HashMap sebagai sesuatu yang disebut, memiliki konsep yang mendasarinya.

Misalnya .... Anda memberi makan sekelompok pasangan kunci-nilai di mana kuncinya adalah panjang, dan ketika Anda menambahkan semua elemen, Anda dapat melakukannya: .keysdan itu akan mengembalikan kepada Anda daftar yang diurutkan secara otomatis.

Itu tergantung pada bagaimana Anda memproses data sebelum bagaimana menurut saya Anda harus melanjutkan penyortiran dan pembalikan berikutnya


0

Metode perbandingan pembanding dapat digunakan untuk membandingkan objek dan kemudian metode reversed()dapat diterapkan untuk membalik urutan -

list.stream().sorted(Comparator.comparing(Employee::getName).reversed()).collect(toList());
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.