Sebanding
Sebanding adalah antarmuka penyortiran.
Jika kelas mengimplementasikan antarmuka yang sebanding, itu berarti "kelas ini mendukung penyortiran". Karena kelas yang menerapkan penyortiran dukungan antarmuka yang sebanding, dengan asumsi bahwa sekarang ada "daftar daftar (atau array) objek kelas yang mengimplementasikan antarmuka yang sebanding", daftar daftar (atau array) dapat diurutkan berdasarkan collections.sort (atau arrays.sort).
Selain itu, "objek kelas yang mengimplementasikan antarmuka yang sebanding" dapat digunakan sebagai kunci dalam "peta yang dipesan (seperti treemap)" atau elemen dalam "set yang dipesan (Treeeset)" tanpa menentukan pembanding.
Antarmuka yang sebanding hanya mencakup satu fungsi, dan definisinya adalah sebagai berikut:
paket java.lang; import java.util.*; antarmuka publik sebanding <t> {public int compareto (t o);} Deskripsi: Misalkan kita "membandingkan ukuran x dan y" melalui x.c.careto (y). Jika Anda mengembalikan "angka negatif", itu berarti "x lebih kecil dari y"; Jika Anda mengembalikan "nol", itu berarti "x sama dengan y"; Jika Anda mengembalikan "angka positif", itu berarti "x lebih besar dari y".
Antarmuka yang sebanding adalah generik, sehingga objek yang mengimplementasikan yang sebanding menyatakan jenis apa yang dapat dibandingkan dengan. (Secara umum, ini adalah jenis objek itu sendiri, tetapi kadang -kadang juga merupakan kelas induk.)
antarmuka publik sebanding {public boolean compareto (t lain); }
Oleh karena itu, antarmuka yang sebanding berisi parameter tipe T, yang merupakan jenis objek yang dapat dibandingkan dengan suatu kelas yang dapat dibandingkan dengan kelas. Ini berarti bahwa jika Anda mendefinisikan kelas yang mengimplementasikan sebanding, seperti string, Anda harus menyatakan tidak hanya kelas mendukung perbandingan, tetapi juga apa yang dapat dibandingkan dengan (biasanya dengan dirinya sendiri):
String kelas publik mengimplementasikan {...} yang sebanding
Sekarang mari kita pertimbangkan implementasi metode biner max (). Anda ingin menerima dua parameter dari jenis yang sama, keduanya sebanding dan sebanding satu sama lain. Untungnya, ini cukup intuitif jika Anda menggunakan metode generik dan parameter tipe terbatas:
public static> t max (t t1, t t2) {if (t1.compareto (t2)> 0) return t1; lain mengembalikan t2; }
Dalam contoh ini, Anda mendefinisikan metode generik yang dihasilkan pada tipe t, dan Anda membatasi ekstensi tipe (implementasi) yang sebanding. Kedua parameter harus dari Tipe T, yang berarti mereka memiliki tipe yang sama, perbandingan dukungan, dan sebanding satu sama lain. mudah!
Bahkan lebih baik, kompiler akan menggunakan penalaran tipe untuk menentukan apa arti nilai T ketika maks () dipanggil. Jadi tidak perlu menentukan t sama sekali, panggilan berikut akan berhasil:
String s = max ("moo", "bark");Kompiler akan menghitung bahwa nilai T yang telah ditentukan adalah string, sehingga akan melakukan kompilasi dan jenis pemeriksaan. Tetapi jika Anda mencoba memanggil max () dengan argumen ke kelas X yang tidak mengimplementasikan sebanding, kompiler tidak akan mengizinkan ini.
Pembanding
Pembanding adalah antarmuka pembanding.
Jika kita perlu mengontrol urutan kelas tertentu, yang dengan sendirinya tidak mendukung penyortiran (yaitu, itu tidak menerapkan antarmuka yang sebanding); Kemudian kita dapat membuat "pembanding kelas ini" untuk mengurutkan. "Pembanding" ini hanya perlu mengimplementasikan antarmuka pembanding.
Artinya, kita dapat membuat pembanding baru dengan "mengimplementasikan kelas pembanding", dan kemudian mengurutkan kelas melalui pembanding.
Antarmuka pembanding hanya mencakup dua fungsi, dan definisinya adalah sebagai berikut:
paket java.util; pembanding antarmuka publik <t> {int compare (t o1, t o2); boolean sama (objek obj);} menjelaskan:
1. Jika suatu kelas ingin mengimplementasikan antarmuka pembanding: ia harus mengimplementasikan fungsi compareTo (T o1, t o2), tetapi mungkin tidak mengimplementasikan fungsi Equals (objek OBJ).
Mengapa kita tidak dapat menerapkan fungsi Equals (Object OBJ)? Karena secara default, sama dengan (objek OBJ) telah diimplementasikan. Semua kelas di Java diwarisi dari java.lang.Object, dan fungsi Equals (Object OBJ) diimplementasikan dalam Object.java; Oleh karena itu, semua kelas lain setara dengan menerapkan fungsi ini.
2. Bandingkan (T o1, t o2) adalah "Bandingkan ukuran O1 dan O2". Mengembalikan "angka negatif" berarti "O1 lebih kecil dari O2"; Mengembalikan "nol", artinya "O1 sama dengan O2"; Mengembalikan "angka positif" berarti "O1 lebih besar dari O2".
Pembanding dan sebanding
Banding adalah antarmuka penyortiran; Jika kelas mengimplementasikan antarmuka yang sebanding, itu berarti "kelas ini mendukung penyortiran".
Pembanding adalah pembanding; Jika kita perlu mengontrol urutan kelas tertentu, kita dapat membuat "pembanding kelas ini" untuk mengurutkannya.
Tidak sulit untuk menemukan bahwa sebanding setara dengan "pembanding internal", sedangkan pembanding setara dengan "pembanding eksternal".
Kami menggunakan program pengujian untuk menggambarkan kedua antarmuka ini. Kode sumber adalah sebagai berikut:
Impor java.util.*; impor java.lang.Compparable;/*** @desc Program perbandingan antara "pembanding" dan "sebanding". * (01) "sebanding" * Ini adalah antarmuka penyortiran yang hanya berisi satu fungsi compareto (). * Kelas mengimplementasikan antarmuka yang sebanding, yang berarti "kelas itu sendiri mendukung penyortiran", yang dapat diurutkan secara langsung melalui arrays.sort () atau collections.sort (). * (02) "pembanding" * Ini adalah antarmuka pembanding, termasuk dua fungsi: perbandingan () dan setara (). * Kelas mengimplementasikan antarmuka pembanding, maka itu adalah "pembanding". Kelas lain dapat diurutkan sesuai dengan pembanding. * * Untuk merangkum: sebanding adalah pembanding internal, sedangkan pembanding adalah pembanding eksternal. * Kelas itu sendiri mengimplementasikan pembanding yang sebanding, yang berarti mendukung penyortiran; Jika tidak mengimplementasikannya sendiri, itu juga dapat diurutkan melalui pembanding pembanding eksternal. */kelas publik CompareComparatorAndComparableTest {public static void main (string [] args) {// Buat arraylist baru (Dynamic Array) ArrayList <Fon> list = new ArrayList <Fon> (); // tambahkan objek ke arraylist list.add (orang baru ("ccc", 20)); list.add (orang baru ("AAA", 30)); list.add (orang baru ("BBB", 10)); list.add (orang baru ("ddd", 40)); // Cetak urutan asli dari daftar System.out.printf ("Sortir Asli, Daftar:%S/N", Daftar); // Urutkan daftar // di sini akan diurutkan sesuai dengan "antarmuka <string> yang sebanding yang diimplementasikan oleh orang", yaitu, diurutkan sesuai dengan "nama", collections.sort (daftar); System.out.printf ("Name Sort, List:%s/n", daftar); // Urutkan daftar melalui "pembanding (ascagecomparator)" // Metode penyortiran ascagecomparator adalah: diurutkan sesuai dengan urutan naik koleksi "usia". System.out.printf ("ASC (Usia) Sort, daftar:%s/n", daftar); // Urutkan daftar melalui "pembanding (descageComparator)". // Metode penyortiran descageComparator adalah: urutkan sesuai dengan urutan penurunan koleksi "usia". System.out.printf ("Sortir (Usia), Daftar:%s/n", daftar); // Tentukan apakah kedua orang itu sama dengan testEquals (); } /*** @desc menguji apakah kedua orang itu sama. * Karena orang mengimplementasikan fungsi Equals (): Jika usia dan nama kedua orang itu sama, kedua orang itu dianggap sama. * Jadi, di sini P1 dan P2 sama. * * TODO: Jika fungsi Equals () secara langsung dihapus, maka P1 tidak sama dengan P2 */ private static void testEquals () {Person p1 = orang baru ("eee", 100); Orang p2 = orang baru ("eee", 100); if (p1.equals (p2)) {system.out.printf (" %s sama %s/n", p1, p2); } else {System.out.printf (" %s tidak sama %s/n", p1, p2); }} /*** @desc class orang. * Orang mengimplementasikan antarmuka yang sebanding, yang berarti bahwa orang itu sendiri mendukung penyortiran*/ kelas private static orang mengimplementasikan <FONDE> {int usia; Nama string; orang publik (nama string, int usia) {this.name = name; this.age = usia; } public string getName () {return name; } public int getage () {usia kembali; } public string toString () {return name + " -" + usia; } / *** Bandingkan apakah dua orang sama: Jika nama dan usianya sama, mereka dianggap sama* / boolean sama dengan (orang orang) {if (this.age == person.age && this.name == person.name) kembalikan true; mengembalikan false; } /*** @desc mengimplementasikan antarmuka "sebanding <string>", yaitu menulis ulang fungsi compareTo <t t>. * Berikut ini adalah perbandingan dengan "nama orang"*/ @Override public int compareto (orang orang) {return name.compareto (person.name); // kembalikan ini.name - person.name; }} / *** @desc ascagecomparator comparator* Ini adalah "Komparator Ascending dari Usia Orang"* / Kelas Statis Privat Ascagecomparator mengimplementasikan komparator <fone> {@override Public int Compare (Person P1, Person P2) {return p1.getage () - p2.getage (); }} / *** @desc descageComparator comparator* Ini adalah "Komparator Ascending Usia Orang"* / Private Static Class DescageComparator mengimplementasikan pembanding <fone> {@override public int perbandingan (orang P1, orang P2) {return p2.getage () - p1.getage (); }}} Berikut ini adalah penjelasan dari program ini.
1. Definisi kelas orang. sebagai berikut:
orang kelas statis pribadi mengimplementasikan <Fone> {int usia; Nama string; ... /*** @desc mengimplementasikan antarmuka "sebanding <string>", yaitu, mengganti fungsi compareTo <tt>. * Berikut ini adalah perbandingan dengan "nama orang"*/ @Override public int compareto (orang orang) {return name.compareto (person.name); // kembalikan ini.name - person.name; }} menjelaskan:
(1) Kelas orang tersebut mewakili seseorang. Ada dua atribut di kelas persong: usia (usia) dan nama "nama orang".
(2) Kelas orang mengimplementasikan antarmuka yang sebanding, sehingga dapat diurutkan.
2. Di main (), kami membuat array daftar orang (daftar). sebagai berikut:
// Buat ArrayList baru (Dynamic Array) ArrayList <Fon> List = New ArrayList <Fon> (); // Tambahkan objek ke ArrayList List.add (orang baru ("CCC", 20)); Daftar. 3. Selanjutnya, kami mencetak semua elemen daftar. sebagai berikut:
// Cetak urutan asli daftar System.out.printf ("Sortir Asli, Daftar:%S/N", Daftar); 4. Lalu, kami mengurutkan daftar melalui fungsi sort () koleksi.
Karena orang mengimplementasikan antarmuka yang sebanding, saat menyortir melalui sort (), itu akan diurutkan sesuai dengan metode pengurutan yang didukung oleh orang, yaitu aturan yang ditentukan oleh compareto (orang orang). sebagai berikut:
// Urutkan daftar // di sini kita akan mengurutkan sesuai dengan "antarmuka <string> yang sebanding yang diimplementasikan oleh orang", yaitu, menyortir sesuai dengan "name" collections.sort (daftar); System.out.printf ("Name Sort, List:%s/n", daftar); 5. sebanding dan pembanding
Kami mendefinisikan dua pembanding, ascagecomparator dan descagecomparator, masing -masing untuk naik dan lebih rendah orang.
6.cascomparator pembandingnya mengurutkan orang dalam menaikkan urutan berdasarkan usia. Kodenya adalah sebagai berikut:
/*** @desc Ascagecomparator comparator* Ini adalah "pembanding naik dari usia orang"*/kelas privat statis ascagecomparator mengimplementasikan komparator <fone> {@override int compare int (orang p1, orang p2) {return p1.getage () - p2.getage (); }} 7. DESCAGEComparator Comparator Ia mengurutkan orang dalam urutan yang menurun berdasarkan usia. Kodenya adalah sebagai berikut:
/*** @desc descagecomparator comparator* Ini adalah "Komparator Meningkat dari Usia Orang"*/Private Static Class DescageComparator mengimplementasikan pembanding <fone> {@Override int komponen (orang P1, orang) {return p2.getage () - p1.getage (); }} 8. Jalankan program sebagai hasilnya, outputnya adalah sebagai berikut:
Sortir asli, daftar: [CCC - 20, AAA - 30, BBB - 10, DDD - 40] Sortir Nama, Daftar: [AAA - 30, BBB - 10, CCC - 20, DDD - 40] ASC (Usia) Sort, Daftar: BBB - 10, CCC - 20, AAA - 30, DDD - 40] (BBB - 10, CCC, 20, AAA - 30, DDD - 40] (BBB - CCC - DAGE - DAN 80, AAA - 30, DDD - 40] BBB - 10] EEE - 100 Equal EEE - 100