Saya memiliki kelas sederhana
public class ActiveAlarm {
public long timeStarted;
public long timeEnded;
private String name = "";
private String description = "";
private String event;
private boolean live = false;
}
dan List<ActiveAlarm>
con. Bagaimana cara mengurutkan dalam urutan naik timeStarted
, lalu dengan timeEnded
? Adakah yang bisa membantu? Saya tahu di C ++ dengan algoritma generik dan operator overload <, tapi saya baru di Jawa.
java
sorting
sort-object
Jennifer
sumber
sumber
Jawaban:
Entah
ActiveAlarm
menerapkanComparable<ActiveAlarm>
atau mengimplementasikanComparator<ActiveAlarm>
dalam kelas yang terpisah. Lalu hubungi:atau
Secara umum, itu ide yang baik untuk melaksanakan
Comparable<T>
jika ada "alami" urutan tunggal ... jika tidak (jika Anda kebetulan ingin menyortir dalam urutan tertentu, tetapi mungkin sama-sama mudah ingin yang berbeda) lebih baik untuk menerapkanComparator<T>
. Situasi khusus ini bisa berjalan baik, jujur ... tapi saya mungkin akan tetap dengan opsi yang lebih fleksibelComparator<T>
.EDIT: Contoh implementasi:
sumber
a = Long.MIN_VALUE, b = 1
..compare
Menggunakan
Comparator
Sebagai contoh:
Dengan Java 8 dan seterusnya, Anda cukup menggunakan ekspresi lambda untuk mewakili instance Comparator.
sumber
compareTo()
harus dilakukan Dari mana asalnya? Di mana saya harus mendefinisikannya?getScores()
adalah pengambil untukscores
yang merupakanList<Integer>
. Ketika Anda melakukannya,getScores().get(0)
Anda mendapatkanInteger
objek.Integer
sudahcompareTo(anotherInteger)
menerapkan metode, Anda tidak perlu mendefinisikannya.JAVA 8 dan Jawaban Di Atas (Menggunakan Ekspresi Lambda)
Di Java 8, ekspresi Lambda diperkenalkan untuk membuat ini lebih mudah! Alih-alih membuat objek Comparator () dengan semua perancahnya, Anda dapat menyederhanakannya sebagai berikut: (Menggunakan objek Anda sebagai contoh)
atau bahkan lebih pendek:
Satu pernyataan itu setara dengan yang berikut:
Pikirkan ekspresi Lambda sebagai hanya mengharuskan Anda untuk memasukkan bagian yang relevan dari kode: tanda tangan metode dan apa yang dikembalikan.
Bagian lain dari pertanyaan Anda adalah bagaimana membandingkan beberapa bidang. Untuk melakukannya dengan ekspresi Lambda, Anda dapat menggunakan
.thenComparing()
fungsi untuk secara efektif menggabungkan dua perbandingan menjadi satu:Kode di atas akan mengurutkan daftar berdasarkan
timeStarted
, dan kemudian olehtimeEnded
(untuk catatan yang memiliki yang samatimeStarted
).Satu catatan terakhir: Sangat mudah untuk membandingkan primitif 'panjang' atau 'int', Anda dapat mengurangi satu dari yang lainnya. Jika Anda membandingkan objek ('Panjang' atau 'Tali'), saya sarankan Anda menggunakan perbandingan bawaannya. Contoh:
EDIT: Terima kasih kepada Lukas Eder karena menunjuk saya
.thenComparing()
berfungsi.sumber
Comparator.comparing().thenComparing()
...Collections
lagi, Anda dapat memanggil langsung ke daftar. Misalnya:myList.sort(Comparator.comparing(Address::getZipCode).thenComparing(Compartor.comparing(Address::getStreetName));
Kami dapat mengurutkan daftar dalam satu dari dua cara:
1. Menggunakan Komparator : Ketika diminta untuk menggunakan logika pengurutan di banyak tempat. Jika Anda ingin menggunakan logika pengurutan di satu tempat, maka Anda dapat menulis kelas dalam anonim sebagai berikut, atau mengekstrak komparator dan menggunakannya di banyak tempat
Kita dapat memiliki pemeriksaan nol untuk properti, jika kita bisa menggunakan 'Panjang' dan bukan 'panjang'.
2. Menggunakan Comparable (pengurutan alami) : Jika algoritma sortir selalu menempel pada satu properti: tulis kelas yang mengimplementasikan metode 'Sebanding' dan ganti metode 'compareTo' seperti yang didefinisikan di bawah ini
}
panggil metode sortir untuk mengurutkan berdasarkan pemesanan alami
sumber
Dalam java8 + ini dapat ditulis dalam satu baris sebagai berikut:
collectionObjec.sort(comparator_lamda)
ataucomparator.comparing(CollectionType::getterOfProperty)
kode:
atau
sumber
Itu seharusnya memberi Anda ide kasar. Setelah selesai, Anda dapat memanggil
Collections.sort()
daftar.sumber
Sejak Java8 ini dapat dilakukan lebih bersih menggunakan kombinasi
Comparator
danLambda expressions
Sebagai contoh:
sumber
Rantai Perbandingan Guava :
sumber
Anda dapat menggunakan
Collections.sort
dan mengirimkannya sendiriComparator<ActiveAlarm>
sumber
Di java Anda perlu menggunakan
Collections.sort
metode statis . Berikut ini adalah contoh untuk daftar objek CompanyRole, disortir pertama dengan mulai dan kemudian pada akhir. Anda dapat dengan mudah beradaptasi untuk objek Anda sendiri.sumber
Anda dapat memanggil Collections.sort () dan mengirimkan Komparator yang perlu Anda tulis untuk membandingkan berbagai properti objek.
sumber
Seperti yang disebutkan, Anda dapat mengurutkan berdasarkan:
Comparable
Comparator
kepadaCollections.sort
Jika Anda melakukan keduanya, itu
Comparable
akan diabaikan danComparator
akan digunakan. Ini membantu bahwa objek nilai memiliki logika mereka sendiriComparable
yang merupakan pengurutan yang paling masuk akal untuk objek nilai Anda, sementara setiap use case memiliki implementasi sendiri.sumber