Setiap contoh yang saya temukan adalah tentang melakukan hal ini secara alfabet, sedangkan elemen-elemen saya perlu diurutkan berdasarkan tanggal.
ArrayList saya berisi objek yang salah satu datamembersnya adalah objek DateTime. Pada DateTime saya dapat memanggil fungsi:
lt() // less-than
lteq() // less-than-or-equal-to
Jadi untuk membandingkan saya bisa melakukan sesuatu seperti:
if(myList.get(i).lt(myList.get(j))){
// ...
}
Apa yang harus saya lakukan di dalam blok if?
Jawaban:
Anda dapat membuat objek Anda sebanding:
Dan kemudian Anda mengurutkannya dengan menelepon:
Namun terkadang Anda tidak ingin mengubah model Anda, seperti ketika Anda ingin mengurutkan pada beberapa properti yang berbeda. Dalam hal ini, Anda dapat membuat komparator dengan cepat:
Namun, hal di atas hanya berfungsi jika Anda yakin bahwa dateTime tidak nol pada saat perbandingan. Adalah bijaksana untuk menangani null juga untuk menghindari NullPointerExceptions:
Atau dalam contoh kedua:
sumber
Karena Java 8 antarmuka Daftar menyediakan metode pengurutan . Dikombinasikan dengan ekspresi lambda solusi termudah adalah
Reverse sorting
Java 8 hadir juga dengan beberapa metode praktis untuk pemilahan terbalik.
sumber
list.sort(Comparator.comparing(o -> o.getDateTime()));
list.sort(Comparator.comparing(MyObject::getDateTime)
Anda dapat menggunakan metode Collections.sort. Ini metode statis. Anda memberikan daftar dan pembanding. Ini menggunakan algoritma mergesort yang dimodifikasi di atas daftar. Itu sebabnya Anda harus memberikannya pembanding untuk melakukan perbandingan pasangan.
Perhatikan bahwa jika myList adalah tipe yang sebanding (yang mengimplementasikan antarmuka Sebanding) (seperti Date, Integer atau String) Anda dapat menghilangkan komparator dan pemesanan alami akan digunakan.
sumber
Jawaban IMHO terbaik dari Tunaki menggunakan Java 8 lambda
sumber
Mengingat
MyObject
memilikiDateTime
anggota dengangetDateTime()
metode, Anda bisa mengurutkanArrayList
yang berisiMyObject
elemen denganDateTime
objek seperti ini:sumber
Inilah cara saya memecahkan:
Semoga ini bisa membantu Anda.
sumber
Dengan diperkenalkannya Java 1.8, stream sangat berguna dalam memecahkan masalah seperti ini:
sumber
Semua jawaban di sini saya temukan sangat kompleks untuk masalah sederhana (setidaknya untuk pengembang java yang berpengalaman, yang saya tidak). Saya memiliki masalah yang sama dan kebetulan pada solusi ini (dan lainnya), dan meskipun mereka memberikan pointer, untuk pemula saya menemukan seperti yang dinyatakan di atas. Solusi saya, tergantung pada di mana di Object Anda Date, dalam hal ini, date adalah elemen pertama dari Object [] di mana dataVector adalah ArrayList yang berisi Objects Anda.
sumber
DateTime
objek yang terkandung di dalam objek lain. Jika itu hanyaDate
atauDateTime
benda yangComparable
ada tidak perlu untukComparator
di tempat pertama.Ini mungkin sebuah respon lama tapi saya menggunakan beberapa contoh dari posting ini untuk membuat pembanding yang akan mengurutkan
ArrayList
dariHashMap<String, String>
oleh satu objek dalam daftar, bahwa menjadi timestamp.Saya punya benda-benda ini:
Objek peta adalah sebagai berikut:
Pemetaan itu adalah apa yang saya gunakan untuk memuat semua objek saya ke dalam daftar array, menggunakan
alList.add(map)
fungsi, dalam satu lingkaran.Sekarang, saya membuat pembanding sendiri:
Saya sekarang dapat memanggil Pembanding kapan saja pada array dan itu akan mengurutkan array saya, memberi saya cap waktu terbaru di posisi 0 (atas daftar) dan cap waktu paling awal di akhir daftar. Pada dasarnya posting baru ditempatkan di atas.
Ini dapat membantu seseorang, itulah sebabnya saya mempostingnya. Mempertimbangkan pernyataan pengembalian dalam fungsi compare (). Ada 3 jenis hasil. Mengembalikan 0 jika sama, mengembalikan> 0 jika kencan pertama sebelum kencan kedua dan mengembalikan <0 jika kencan pertama setelah kencan kedua. Jika Anda ingin daftar Anda dibalik, maka alihkan kedua pernyataan pengembalian itu! Sederhana =]
sumber
Lewati argumen ArrayList In.
sumber
Gunakan pendekatan di bawah ini untuk mengidentifikasi tanggal apakah sortir atau bukan
sumber
SimpleDateFormat
. Setidaknya bukan sebagai opsi pertama. Dan bukan tanpa reservasi apa pun. Hari ini kita memiliki jauh lebih baikjava.time
, API tanggal dan waktu Jawa modern danDateTimeFormatter
.Kelas Date sudah mengimplementasikan antarmuka Comparator. Dengan asumsi Anda memiliki kelas di bawah ini:
Dan katakanlah Anda memiliki daftar objek A sebagai
List<A> aList
, Anda dapat dengan mudah mengurutkannya dengan API aliran Java 8 (cuplikan di bawah):sumber
Pemirsa di masa depan, saya pikir ini adalah solusi paling sederhana, jika model Anda berisi tanggal tipe string ("2020-01-01 10:00:00" misalnya), maka cukup tulis baris berikut untuk mengurutkan data berdasarkan tanggal turun dari terbaru ke terlama:
sumber