Saya memiliki kelas yang diberi nama Person
dengan beberapa properti, misalnya:
public class Person {
private int id;
private String name, address;
// Many more properties.
}
Banyak Person
-objects disimpan di file ArrayList<Person>
. Saya ingin mengurutkan daftar ini dengan beberapa parameter sortir, dan berbeda dari waktu ke waktu. Misalnya saya mungkin suatu saat ingin mengurutkan dengan name
naik lalu address
turun, dan di lain waktu hanya dengan id
turun.
Dan saya tidak ingin membuat metode sortir saya sendiri (yaitu, saya ingin menggunakan Collections.sort(personList, someComparator)
. Apa solusi paling elegan yang dapat mencapai ini?
comparator.reversed()
untuk turun dan Anda dapat menggunakancomparator1.thenComparing(comparator2)
untuk merangkai pembanding.Anda dapat membuat komparator untuk setiap properti yang mungkin ingin Anda sortir dan kemudian mencoba "rangkaian pembanding" :-) seperti ini:
sumber
Salah satu caranya adalah dengan membuat
Comparator
yang mengambil sebagai argumen daftar properti untuk diurutkan, seperti yang ditunjukkan contoh ini.Ini kemudian dapat digunakan dalam kode misalnya seperti ini:
sumber
Salah satu pendekatannya adalah dengan menulis
Comparator
s. Ini bisa menjadi metode perpustakaan (saya yakin itu ada di suatu tempat di luar sana).Menggunakan:
Atau, perhatikan bahwa
Collections.sort
ini adalah jenis yang stabil. Jika kinerja tidak terlalu penting, Anda mengurutkan menjadi urutan sekunder sebelum yang utama.sumber
compose(nameComparator, compose(addressComparator, idComparator))
Itu akan terbaca sedikit lebih baik jika Java memiliki metode ekstensi.Pembanding memungkinkan Anda melakukannya dengan sangat mudah dan alami. Anda dapat membuat satu instance komparator, baik di kelas Person Anda sendiri, atau di kelas Layanan yang terkait dengan kebutuhan Anda.
Contoh, menggunakan kelas dalam anonim:
Jika Anda memiliki banyak, Anda juga dapat menyusun kode komparator sesuka Anda. Misalnya, Anda dapat:
sumber
Saya pikir menggabungkan penyortir ke kelas Person, seperti dalam jawaban Anda, bukanlah ide yang baik, karena menggabungkan perbandingan (biasanya didorong oleh bisnis) dan objek model untuk berdekatan satu sama lain. Setiap kali Anda ingin mengubah / menambahkan sesuatu yang penyortir, Anda perlu menyentuh kelas orang, yang biasanya sesuatu yang tidak ingin Anda lakukan.
Menggunakan Service atau sesuatu yang serupa, yang menyediakan instance Comparator, seperti yang diusulkan KLE, terdengar jauh lebih fleksibel dan dapat diperluas.
sumber
Pendekatan saya dibangun di atas Yishai. Kesenjangan utamanya adalah tidak ada cara untuk mengurutkan menaik pertama untuk suatu atribut dan setelah itu menurun untuk atribut lainnya. Ini tidak bisa dilakukan dengan pencacahan. Untuk itu saya menggunakan kelas. Karena SortOrder sangat bergantung pada tipe yang saya suka untuk mengimplementasikannya sebagai kelas dalam orang.
Kelas 'Orang' dengan kelas dalam 'SortOrder':
Contoh penggunaan kelas Person dan SortOrder-nya:
oRUMOo
sumber
Saya baru-baru ini menulis Comparator untuk mengurutkan beberapa bidang dalam catatan String yang dipisahkan. Ini memungkinkan Anda untuk menentukan pemisah, struktur rekaman, dan aturan pengurutan (beberapa di antaranya khusus untuk tipe). Anda dapat menggunakan ini dengan mengonversi rekaman Person menjadi String yang dipisahkan.
Informasi yang diperlukan disebarkan ke Comparator itu sendiri, baik secara terprogram atau melalui file XML.
XML divalidasi oleh paket file XSD yang disematkan. Misalnya, di bawah ini adalah tata letak rekaman yang dibatasi tab dengan empat bidang (dua di antaranya dapat diurutkan):
Anda kemudian akan menggunakan ini di java seperti ini:
Perpustakaan dapat ditemukan di sini:
http://sourceforge.net/projects/multicolumnrowcomparator/
sumber
Misalkan sebuah kelas
Coordinate
ada di sana dan seseorang harus mengurutkannya dengan kedua cara menurut koordinat X dan koordinat Y. Dibutuhkan dua pembanding berbeda untuk itu. Berikut ini contohnyasumber