Saya membaca tentang menyortir ArrayLists menggunakan Comparator tetapi dalam semua contoh yang digunakan orang compareTo
yang menurut beberapa penelitian adalah metode untuk Strings.
Saya ingin mengurutkan ArrayList objek kustom berdasarkan salah satu propertinya: objek Date ( getStartDay()
). Biasanya saya membandingkannya dengan item1.getStartDate().before(item2.getStartDate())
begitu saya bertanya-tanya apakah saya bisa menulis sesuatu seperti:
public class CustomComparator {
public boolean compare(Object object1, Object object2) {
return object1.getStartDate().before(object2.getStartDate());
}
}
public class RandomName {
...
Collections.sort(Database.arrayList, new CustomComparator);
...
}
java
sorting
date
comparator
Samuel
sumber
sumber
Jawaban:
Sejak
Date
diterapkanComparable
, ia memilikicompareTo
metode sepertiString
halnya.Jadi kebiasaan Anda
Comparator
dapat terlihat seperti ini:The
compare()
Metode harus mengembalikanint
, sehingga Anda tidak bisa langsung mengembalikanboolean
seperti Anda berencana untuk tetap.Kode sortir Anda hampir sama dengan yang Anda tulis:
Cara yang sedikit lebih pendek untuk menulis semua ini, jika Anda tidak perlu menggunakan kembali komparator Anda, adalah menuliskannya sebagai kelas anonim sebaris:
Sejak java-8
Anda sekarang dapat menulis contoh terakhir dalam bentuk yang lebih pendek dengan menggunakan ekspresi lambda untuk
Comparator
:Dan
List
memilikisort(Comparator)
metode, sehingga Anda dapat mempersingkat ini lebih jauh:Ini adalah idiom umum sehingga ada metode bawaan untuk menghasilkan a
Comparator
untuk kelas denganComparable
kunci:Semua ini adalah bentuk yang setara.
sumber
int
dan sebaiknya Anda gunakanDate#compareTo()
untuk ini. Mengapa hal ini tidak terunggul di atas, jawaban lain ada di luar saya. Tautan ini juga berguna: Tutorial Pemesanan Objek di Sun.com .List.sort()
.Kelas-kelas yang memiliki urutan penyortiran alami (nomor kelas, sebagai contoh) harus mengimplementasikan antarmuka yang sebanding, sementara kelas-kelas yang tidak memiliki urutan penyortiran alami (ketua kelas, sebagai contoh) harus disediakan dengan pembanding (atau pembanding anonim) kelas).
Dua contoh:
Pemakaian:
sumber
public
di depanclass
.Untuk mengurutkan,
ArrayList
Anda dapat menggunakan cuplikan kode berikut:sumber
Ya kamu bisa. Ada dua opsi dengan membandingkan item, antarmuka yang sebanding , dan antarmuka komparator .
Kedua antarmuka ini memungkinkan untuk perilaku yang berbeda. Sebanding memungkinkan Anda untuk membuat objek bertindak seperti Anda baru saja dijelaskan Strings (pada kenyataannya, String mengimplementasikan Sebanding). Yang kedua, Pembanding, memungkinkan Anda untuk melakukan apa yang Anda minta. Anda akan melakukannya seperti ini:
Itu akan menyebabkan metode Collections.sort menggunakan komparator Anda untuk mekanisme penyortirannya. Jika objek dalam mengimplementasikan ArrayList sebanding, Anda bisa melakukan sesuatu seperti ini:
Kelas Koleksi berisi sejumlah alat yang berguna dan umum ini.
sumber
Ekspresi lambda JAVA 8
ATAU
sumber
Collections.sort(studList, Comparator.comparing(Student::getFirstName));
studList.sort(Comparator.comparing(Student::getFirstName));
Dengan Java 8 Anda dapat menggunakan referensi metode untuk komparator Anda:
sumber
Karena teknologi muncul setiap hari, jawabannya akan berubah seiring waktu. Saya melihat LambdaJ dan tampaknya sangat menarik.
Anda dapat mencoba menyelesaikan tugas ini dengan LambdaJ . Anda dapat menemukannya di sini: http://code.google.com/p/lambdaj/
Di sini Anda memiliki contoh:
Urutkan berulang
Sortir dengan lambda
Tentu saja, memiliki keindahan semacam ini berdampak pada kinerja (rata-rata 2 kali), tetapi dapatkah Anda menemukan kode yang lebih mudah dibaca?
sumber
sumber
Cara mudah terbaik dengan JAVA 8 adalah untuk jenis Alfabet Bahasa Inggris
Implementasi Kelas
Menyortir
Jika Anda ingin mengurutkan untuk alfabet yang mengandung karakter bukan bahasa Inggris, Anda dapat menggunakan Lokal ... Di bawah kode ini menggunakan pengurutan karakter Turki ...
Implementasi Kelas
Menyortir
sumber
Referensi fungsi & metode
The
Collections.sort
Metode dapat mengurutkanList
menggunakanComparator
Anda lulus. ItuComparator
dapat diimplementasikan menggunakanComparator.comparing
metode di mana Anda dapat melewati referensi metode yang diperlukanFunction
. Untungnya, kode yang sebenarnya jauh lebih sederhana dan lebih pendek dari deskripsi ini.Untuk Java 8:
atau
Cara lain adalah
sumber
Dari
Java 8
dan selanjutnya kita tidak harus menggunakanCollections.sort()
secara langsung.List
antarmuka memilikisort()
metode default :Lihat http://visvv.blogspot.in/2016/01/sorting-objects-in-java-8.html .
sumber
Java 8 Lambda mempersingkat semacam itu.
sumber
Collections.sort(stdList, Comparator.comparing(SomeClass::getName));
Anda dapat menggunakan Bean Comparator untuk mengurutkan properti apa pun di kelas khusus Anda.
sumber
Ya, itu mungkin misalnya dalam jawaban ini saya urutkan berdasarkan properti
v
kelasIndexValue
Jika Anda perhatikan di sini saya membuat kelas dalam anonim (yang merupakan Java untuk penutupan) dan meneruskannya langsung ke
sort
metode kelasArrays
Objek Anda juga dapat mengimplementasikan
Comparable
(itulah yang dilakukan oleh String dan sebagian besar pustaka inti di Jawa) tetapi itu akan menentukan "susunan urutan alami" dari kelas itu sendiri, dan tidak membiarkan Anda memasang yang baru.sumber
Comparator
:)Saya menemukan sebagian besar jika tidak semua jawaban ini bergantung pada kelas yang mendasari (Obyek) untuk mengimplementasikan sebanding atau memiliki antarmuka yang sebanding pembantu.
Tidak dengan solusi saya! Kode berikut memungkinkan Anda membandingkan bidang objek dengan mengetahui nama string mereka. Anda dapat dengan mudah memodifikasinya untuk tidak menggunakan nama, tetapi kemudian Anda perlu memaparkannya atau membuat salah satu Objek yang ingin Anda bandingkan.
sumber
Anda dapat mencoba Pemesanan Jambu :
sumber
Anda dapat Mengurutkan menggunakan java 8
sumber
Cuplikan kode ini mungkin berguna. Jika Anda ingin mengurutkan Objek dalam kasus saya, saya ingin mengurutkan berdasarkan VolumeName:
Ini bekerja. Saya menggunakannya di jsp saya.
sumber
Dengan perpustakaan ini di sini Anda dapat mengurutkan daftar objek khusus pada banyak kolom. Perpustakaan menggunakan fitur versi 8.0. Sampel juga tersedia di sana. Berikut adalah contoh yang harus dilakukan
sumber
Anda dapat melihat ke dalam presentasi ini di Java Forum di Stuttgart Germany pada tahun 2016.
Hanya beberapa slide yang menggunakan bahasa Jerman, 99% kontennya adalah kode sumber Java "Berbasis Bahasa Inggris"; Suka
dimana
OurCustomComparator
menggunakan metode default (dan ide menarik lainnya). Seperti yang ditunjukkan, mengarah ke kode yang sangat ringkas untuk memilih beberapa metode pengambil untuk menyortir; dan rantai super sederhana (atau membalikkan) kriteria semacam.Jika Anda tertarik dengan java8, Anda akan menemukan banyak materi untuk memulai.
sumber
Yang baru sejak 1.8 adalah metode List.sort () alih-alih menggunakan Collection.sort () sehingga Anda langsung memanggil mylistcontainer.sort ()
Berikut ini cuplikan kode yang menunjukkan fitur List.sort ():
Kelas Buah adalah:
sumber
kelas customComparator Anda harus mengimplementasikan java.util.Comparator agar dapat digunakan. itu juga harus mengungguli bandingkan () DAN sama dengan ()
bandingkan () harus menjawab pertanyaan: Apakah objek 1 kurang dari, sama dengan atau lebih besar dari objek 2?
dokumen lengkap: http://java.sun.com/j2se/1.5.0/docs/api/java/util/Comparator.html
sumber
Saya lebih suka proses ini:
Jika Anda daftar objek memiliki properti yang dipanggil
startDate
, Anda dapat menelepon menggunakan ini berulang-ulang. Anda bahkan dapat merantai merekastartDate.time
.Hal ini memerlukan objek Anda untuk menjadi
Comparable
yang berarti Anda membutuhkancompareTo
,equals
danhashCode
implementasi.Ya, itu bisa lebih cepat ... Tapi sekarang Anda tidak perlu membuat Pembanding baru untuk setiap jenis pengurutan. Jika Anda dapat menghemat waktu dev dan menyerah saat runtime, Anda bisa menggunakan yang ini.
sumber
Menggunakan Java 8, penggunaan dapat menentukan penggunaan
Comparator
dalam satu barisComparator.comparing()
Gunakan salah satu dari cara berikut:
Pilihan 1:
Pilihan 2:
sumber
Kelas khusus Anda dapat mengimplementasikan antarmuka "Sebanding", yang membutuhkan implementasi metode CompareTo. Dalam metode CompareTo, Anda kemudian dapat mendefinisikan apa artinya suatu objek kurang dari atau lebih dari objek lainnya. Jadi dalam contoh Anda, ini dapat terlihat seperti ini:
..........
Angka negatif menunjukkan bahwa ini lebih kecil dari objek yang dibandingkan. Angka positif menunjukkan bahwa ini lebih besar daripada yang dibandingkan dengan objek dan Nol berarti bahwa objek tersebut sama.
Anda kemudian dapat menggunakan collections.sort (myList) untuk mengurutkan daftar Anda tanpa harus memberi makan di pembanding. Metode ini juga memiliki keuntungan memiliki hal-hal yang diurutkan secara otomatis jika Anda menggunakan struktur data koleksi yang diurutkan seperti TreeSet atau TreeMap.
Anda dapat memeriksa artikel ini jika Anda ingin membaca lebih lanjut tentang antarmuka Sebanding (pengungkapan: Saya penulis;)) https://nullbeans.com/the-java-comparable-interface-automatic-sort-of-collections/
sumber
Anda juga bisa menggunakan Springs PropertyComparator jika Anda hanya memiliki jalur properti String ke properti (bersarang) yang ingin Anda urutkan:
Kekurangannya adalah, pembanding ini secara diam-diam mengabaikan properti yang tidak ada atau tidak dapat diakses dan menangani ini sebagai nilai nol untuk perbandingan. Ini berarti, Anda harus dengan hati-hati menguji pembanding tersebut atau memvalidasi keberadaan jalur properti.
sumber
menggunakan api streaming java-8 Anda dapat mengurutkan
ArrayList
berdasarkan:sumber
Saya telah mencoba banyak solusi berbeda yang tersedia di internet tetapi solusi yang berfungsi untuk saya tersedia di tautan di bawah ini.
https://www.java67.com/2017/07/how-to-sort-arraylist-of-objects-using.html
sumber