Saya memiliki daftar objek yang perlu saya sortir di lapangan, misalnya Score. Tanpa banyak berpikir saya menulis kelas baru yang mengimplementasikan Pembanding, yang melakukan tugas dan berhasil.
Sekarang melihat kembali ini, saya bertanya-tanya apakah saya harus memiliki kelas saya mengimplementasikan Comparable daripada membuat kelas baru yang mengimplementasikan Comparator. Skor adalah satu-satunya bidang tempat objek akan dipesan.
Apa yang telah saya lakukan dapat diterima sebagai praktik?
Apakah pendekatan yang tepat "Pertama, minta kelas mengimplementasikan Sebanding (untuk pengurutan alami) dan jika perbandingan bidang alternatif diperlukan, buatlah kelas baru yang mengimplementasikan Pembanding"?
Jika (2) di atas benar, lalu apakah itu berarti bahwa seseorang harus mengimplementasikan Comparator hanya setelah mereka mengimplementasikan class Comparable? (Dengan asumsi saya memiliki kelas asli).
sumber
Gunakan
Comparable
jika Anda ingin mendefinisikan perilaku pengurutan default (alami) dari objek yang dimaksud, praktik yang umum adalah menggunakan pengenal teknis atau alami (database?) Objek untuk ini.Gunakan
Comparator
jika Anda ingin menentukan perilaku pemesanan terkontrol eksternal , ini dapat menggantikan perilaku pemesanan default.sumber
Comparable
berarti saya mendefinisikan tatanan alam?" , ini memberi saya jawaban yang saya cari. Terima kasih :)Penggunaan
Comparable
:Penggunaan
Comparator
:Comparable
.Comparable
).sumber
Sebanding -
java.lang.Comparable: int compareTo(Object o1)
Objek yang sebanding mampu membandingkan dirinya dengan objek lain. Kelas itu sendiri harus mengimplementasikan antarmuka java.lang.Comparable agar dapat membandingkan instance-nya.
only one sort sequence
berdasarkan properti instance. EX:Person.id
Pembanding -
java.util.Comparator: int compare(Object o1, Object o2)
Sebuah objek pembanding mampu membandingkan dua objek yang berbeda. Kelas tidak membandingkan instance-nya, tetapi beberapa instance kelas lainnya. Kelas pembanding ini harus mengimplementasikan antarmuka java.util.Comparator.
many sort sequence
dan memberi nama masing-masing, berdasarkan properti instance. EX:Person.id, Person.name, Person.age
Contoh:
Untuk Java 8 Lambda: Pembanding lihat posting saya.
sumber
Comparable harus digunakan saat Anda membandingkan instance dari kelas yang sama.
Pembanding dapat digunakan untuk membandingkan instance dari kelas yang berbeda.
Comparable diimplementasikan oleh kelas yang perlu mendefinisikan tatanan natural untuk objeknya. Seperti String mengimplementasikan Comparable.
Jika seseorang menginginkan urutan pengurutan yang berbeda maka dia dapat menerapkan pembanding dan menentukan caranya sendiri untuk membandingkan dua contoh.
sumber
Jika pengurutan objek harus didasarkan pada tatanan natural maka gunakan Comparable sedangkan jika pengurutan Anda perlu dilakukan pada atribut objek yang berbeda, gunakan Comparator di Java.
Perbedaan utama antara Comparable dan Comparator:
sumber
Pembanding melakukan semua hal yang sebanding, ditambah lagi.
Saya menemukan pendekatan terbaik untuk menggunakan komparator sebagai kelas anonim sebagai berikut:
Anda dapat membuat beberapa versi dari metode tersebut langsung di dalam kelas yang Anda rencanakan untuk disortir. Jadi, Anda dapat memiliki:
sortAccountsByPriorityAndType
dll ...
Sekarang, Anda dapat menggunakan metode pengurutan ini di mana saja dan mendapatkan kode yang digunakan kembali. Ini memberi saya segala sesuatu yang sebanding, ditambah lebih banyak ... jadi saya tidak melihat alasan untuk menggunakan yang sebanding sama sekali.
sumber
Saya akan mengatakan:
sumber
Poin-poin berikut membantu Anda dalam memutuskan di situasi mana seseorang harus menggunakan Comparable dan di mana Comparator:
1) Ketersediaan Kode
2) Kriteria Penyortiran Tunggal versus Banyak
3) Arays.sort () dan Collection.sort ()
4) Sebagai kunci di SortedMap dan SortedSet
5) Lebih Banyak Jumlah Kelas versus Fleksibilitas
6) Perbandingan antar kelas
7) Tatanan Alami
Untuk artikel yang lebih rinci, Anda dapat merujuk Kapan menggunakan sebanding dan kapan menggunakan komparator
sumber
sumber
Jika Anda memerlukan penyortiran urutan alami - Dapat Dibandingkan Pengguna JIKA Anda memerlukan Penyortiran Pesanan Kustom - Gunakan Pembanding
Contoh:
Penyortiran tatanan natural akan didasarkan pada id karena akan unik dan penyortiran pesanan khusus adalah nama dan departemen.
Refrensi:
Kapan sebuah kelas menjadi Comparable dan / atau Comparator? http://javarevisited.blogspot.com/2011/06/comparator-and-comparable-in-java.html
sumber
Ada pertanyaan serupa di sini: Kapan sebuah kelas menjadi Comparable dan / atau Comparator?
Saya akan mengatakan yang berikut: Menerapkan Sebanding untuk sesuatu seperti pemesanan alami, misalnya berdasarkan ID internal
Terapkan Comparator jika Anda memiliki algoritme pembanding yang lebih kompleks, misalnya banyak bidang dan sebagainya.
sumber
Comparable
.Sebanding:
Kapan pun kita ingin menyimpan hanya elemen homogen dan urutan alami default diperlukan, kita dapat menggunakan
comparable
antarmuka implementasi kelas .Pembanding:
Setiap kali kami ingin menyimpan elemen homogen dan heterogen dan kami ingin mengurutkan dalam urutan penyortiran kustom default, kami dapat menggunakan
comparator
antarmuka.sumber
Kebutuhan saya diurutkan berdasarkan tanggal.
Jadi, saya menggunakan Comparable dan itu bekerja dengan mudah untuk saya.
Satu batasan dengan Comparable adalah bahwa mereka tidak dapat digunakan untuk Koleksi selain Daftar.
sumber
Jika Anda memiliki kelas lebih baik pergi dengan Comparable . Umumnya Comparator digunakan jika Anda tidak memiliki kelas tetapi Anda harus menggunakannya TreeSet atau TreeMap karena Comparator dapat dikirimkan sebagai parameter dalam pembuat TreeSet atau TreeMap. Anda dapat melihat cara menggunakan Comparator dan Comparable di http:// prec tepatnyaconcise.com/java/collections/g_comparator.php
sumber
Saya telah diminta untuk menyortir kisaran angka tertentu dengan lebih baik daripada waktu yang diketahui dalam salah satu wawancara. (Tidak menggunakan jenis Penghitungan)
Mengimplementasikan antarmuka Comparable di atas objek memungkinkan algo pengurutan implisit menggunakan metode bandingkanTo yang diganti untuk mengurutkan elemen sortir dan itu akan menjadi waktu linier.
sumber
Comparable adalah urutan pengurutan alami default yang disediakan untuk nilai numerik menaik dan untuk string adalah urutan abjad. misalnya:
Pembanding adalah urutan pengurutan kustom yang diterapkan di kelas myComparator kustom dengan mengganti metode perbandingan untuk misalnya:
sumber
Pendekatan yang sangat sederhana adalah dengan mengasumsikan bahwa kelas entitas yang dimaksud direpresentasikan dalam database dan kemudian dalam tabel database, apakah Anda memerlukan indeks yang terdiri dari bidang kelas entitas? Jika jawabannya ya, terapkan pembanding dan gunakan bidang indeks untuk urutan pengurutan alami. Dalam semua kasus lain gunakan pembanding.
sumber
Lib anotasi saya untuk menerapkan
Comparable
danComparator
:Klik link untuk melihat lebih banyak contoh. http://code.google.com/p/compamatic/wiki/CompamaticByExamples
sumber