Saya memiliki Daftar ganda di java dan saya ingin mengurutkan ArrayList dalam urutan menurun.
Input ArrayList adalah sebagai berikut:
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);
Put out harus seperti ini
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
sumber
sumber
Comparator
:)Double
s.reverse
, tetapi menyortir turun sebenarnya bisa lebih cepat kemudian menyortir naik dan kemudian membalikkan. Selain itu, menggunakan implementasi Daftar yang mendukungComparator
sebagai argumen konstruktor (sehingga menjaganya tidak berubah) akan memastikan daftar diurutkan setiap saat.Collections.sort
gunakan dicompareTo
belakang layar.Collections.sort(list, Collections.reverseOrder());
. Selain lebih idiomatis (dan mungkin lebih efisien), menggunakan pembanding urutan terbalik memastikan bahwa jenisnya stabil (artinya urutan elemen tidak akan berubah ketika mereka sama menurut pembanding, sedangkan membalikkan akan mengubah urutan ).Menurun:
sumber
CustomData
yaituList<AnotherModel>
yangAnotherModel
memilikiid
dan saya ingin mengurutkan berdasarkanid
? Dan saya hanya mengaksesCustomData
model di kelas saya.Integer.compare(rhs.customInt, lhs.customInt);
Gunakan metode util dari kelas java.util.Collections , yaitu
Bahkan, jika Anda ingin mengurutkan objek khusus yang dapat Anda gunakan
lihat koleksi api
sumber
Sebagai contoh Anda, ini akan melakukan keajaiban di Java 8
Tetapi jika Anda ingin mengurutkan berdasarkan beberapa bidang objek yang Anda sortir, Anda dapat melakukannya dengan mudah dengan:
atau
atau
Sumber: https://docs.oracle.com/javase/8/docs/api/java/util/Comparator.html
sumber
Menggunakan lambdas (Java8), dan melepasnya ke sintaks yang paling bawah (JVM akan menyimpulkan banyak dalam hal ini), Anda mendapatkan:
Versi yang lebih verbose:
Penggunaan lambda dimungkinkan karena antarmuka Comparator hanya memiliki satu metode untuk diterapkan, sehingga VM dapat menyimpulkan metode mana yang diterapkan. Karena jenis params dapat disimpulkan, mereka tidak perlu dinyatakan (yaitu
(a, b)
bukannya(Double a, Double b)
. Dan karena tubuh lambda hanya memiliki satu baris, dan metode ini diharapkan untuk mengembalikan nilai, makareturn
disimpulkan dan kawat gigi tidak perlu.sumber
Dengan Java8 ada metode pengurutan default pada antarmuka Daftar yang akan memungkinkan Anda untuk mengurutkan koleksi jika Anda menyediakan Pembanding. Anda dapat dengan mudah mengurutkan contoh dalam pertanyaan sebagai berikut:
Catatan: argumen dalam lambda ditukar ketika diteruskan ke Double.compare untuk memastikan jenisnya menurun
sumber
locationDetails.sort((locationDetailAsc,locationDetailsDsc) -> Long.compare(locationDetailsDsc.getSnapshot().getQuantity(), locationDetailAsc.getSnapshot().getQuantity()));
Anda dapat menggunakan
Collections.sort(list)
untuk mengurutkanlist
jika Andalist
mengandungComparable
elemen. Kalau tidak, saya akan merekomendasikan Anda untuk mengimplementasikan antarmuka itu seperti di sini:dan tentu saja memberikan realisasi
compareTo
metode Anda sendiri seperti di sini:Dan kemudian Anda dapat kembali menggunakan
Colection.sort(list)
karena sekarang daftar berisi objek dengan tipe Sebanding dan dapat diurutkan. Pesanan tergantung padacompareTo
metode. Periksa https://docs.oracle.com/javase/tutorial/collections/interfaces/order.html ini untuk informasi lebih rinci.sumber
Collections.sort
memungkinkan Anda untuk melewati contohComparator
yang mendefinisikan logika penyortiran Jadi, bukannya menyortir daftar dalam urutan alami dan kemudian membalikkan itu, satu hanya dapat lulusCollections.reverseOrder()
untuksort
untuk menyortir daftar dalam urutan terbalik:Seperti disebutkan oleh @ Marco13, selain lebih idiomatis (dan mungkin lebih efisien), menggunakan pembanding urutan terbalik memastikan bahwa pengurutannya stabil (artinya urutan elemen tidak akan berubah ketika mereka sama menurut pembanding, sedangkan membalikkan akan mengubah urutan)
sumber
sumber
Berikut ini adalah lembar contekan pendek yang mencakup beberapa kasus umum:
sumber
jika Anda menggunakan Java SE 8, maka ini mungkin bisa membantu.
sumber
Collections.reverseOrder()
tanpa argumen, yang membuat implementasi AndacompareDouble
berlebihan (itu setara dengan pemesanan alamiDouble
s). Jawabannya di sini adalahCollections.sort(testList, Collections.reverseOrder());
| * | Menyortir Daftar:
| => Urutkan Urutan Pesanan:
| => Urutkan Urutan Dsc:
| * | Membalik urutan Daftar:
sumber
Anda bisa melakukan ini:
Koleksi memiliki Pembanding default yang dapat membantu Anda dengan itu.
Selain itu, jika Anda ingin menggunakan beberapa fitur Java 8 baru, Anda dapat melakukannya seperti itu:
sumber
Misalnya saya punya Person kelas: Nama string, int age ==> Buat Person baru (nama, umur)
sumber
if you want to short by name
->if you want to sort by name
Di JAWA 8 sekarang jauh lebih mudah.
- Untuk kebalikannya gunakan ini
sumber
Anda bisa menggunakan seperti itu
sumber
Dengan Eclipse Collections, Anda dapat membuat daftar ganda primitif, mengurutkannya, lalu membalikkannya untuk meletakkannya secara berurutan. Pendekatan ini akan menghindari tinju ganda.
Jika Anda menginginkan
List<Double>
, maka yang berikut ini akan berfungsi.Jika Anda ingin mempertahankan tipenya
ArrayList<Double>
, Anda dapat menginisialisasi dan mengurutkan daftar menggunakanArrayListIterate
kelas utilitas sebagai berikut:Catatan: Saya pengendara untuk Eclipse Collections .
sumber
Baris berikut harus tebal
sumber