Untuk menyusun objek dari jenis yang sama yang disimpan dalam tatasusunan atau koleksi, pembangun Java menghasilkan
Salah satu cara yang paling mudah dan berkesan untuk mengisih tatasusunan objek ialah kaedah
Comparable
. Ia mengisytiharkan hanya satu kaedah compareTo
:
public interface Comparable<T> {
public int compareTo(T o);
}
Antara muka Comparable
diparameterkan mengikut jenis objek yang diterima sebagai parameter kepada kaedah compareTo
. Dalam kes ini, kami memberi amaran kepada pengkompil jenis objek yang akan kami bandingkan. Jika syarat identiti jenis tidak dipenuhi, kami akan menerima ralat ClassCastException
. Kaedah compareTo
dalam Java membandingkan objek panggilan dengan objek yang diluluskan sebagai parameter dan mengembalikan integer sebagai hasil perbandingan:
- positif jika objek panggilan lebih besar daripada objek yang diluluskan sebagai parameter;
- negatif jika objek panggilan lebih kecil daripada objek yang diluluskan sebagai parameter;
- batal jika objek adalah sama.
Mengapa kaedah compareTo diperlukan dalam Java?
Seorang pengaturcara Java selalunya perlu berurusan dengan tatasusunan dan senarai objek. Apabila bekerja dengan jumlah data yang besar, selalunya mudah untuk menyimpannya dalam bentuk tersusun atau disusun. Pertama, ia mempercepatkan kerja dengan pengumpulan apabila mencari maklumat yang diperlukan, dan kedua, data yang teratur dilihat secara visual lebih baik.sort()
kelas Arrays
, dan koleksi objek dalam bentuk senarai ialah kaedah kelas yang serupa Collections
. Untuk mengisih menggunakan kaedah ini, pembangun Java memberi kami kebebasan untuk memilih cara menentukan kriteria pengisihan: dengan melaksanakan antara muka Comparable
dalam kelas objek yang ingin kami isih, atau dengan menggunakan Comparator
. Dalam kes pertama, kaedah pengisihan menerima satu set objek dalam bentuk tatasusunan atau senarai:
sort(T[]array)//sorting массива
sort(List<T> list)// sorting списка
dan dalam yang kedua - ditambah satu lagi pelaksanaan antara muka Comparator
:
sort(T[]array, Comparator <? super T> comparator)//sorting массива
sort(List<T> list, Comparator <? super T> comparator)// sorting списка
Antara muka Comparable
digunakan apabila kita ingin menetapkan susunan objek semula jadi (yang paling logik dari sudut pandangan kita) semasa menyusun. Ia juga merupakan satu cara untuk "memperbaiki" algoritma untuk membandingkan objek kelas ini pada peringkat reka bentuk. Sebagai contoh, menggunakan pelaksanaan antara muka ini, kriteria untuk susunan semula jadi dalam kelas pembalut jenis primitif utama ditakrifkan: , Byte
, Character
, Long
, Integer
, Short
, Double
, Float
, Boolean
. String
Ini juga bermakna bahawa kelas ini mempunyai kaedah yang dilaksanakan compareTo
yang boleh kita gunakan dalam program jika perlu. Mari lihat contoh perbandingan rentetan untuk melihat cara kaedah ini dilaksanakan dalam kelas String
.
String str1="Аарон";
String str2="АAPOH";
String str3="аарон";
String str4="ААрон";
String str5="аАрон";
String str6="Берта";
String str7="берта";
String[] allStr=new String[]{str1,str2,str3,str4, str5,str6, str7};
Arrays.sort(allStr);
for (String s:allStr){
System.out.println(s);
}
}
Jika kita melaksanakan kod ini dalam kaedah main
, kita akan mendapat hasil berikut:
АAPOH
ААрон
Аарон
Берта
аАрон
аарон
берта
Seperti yang anda boleh lihat dalam contoh dalam class String
, kaedah compareTo
menyusun rentetan mengikut abjad, leksikografik dan sensitif huruf besar-besaran. Susunan perbandingan rentetan inilah yang ditakrifkan oleh pembangun kelas String
sebagai semula jadi. Untuk pemahaman yang lebih mudah tentang susunan leksikografi, sudah cukup untuk mengingati bagaimana perkataan disusun dalam kamus bahasa. Apabila membandingkan nombor, objek disusun mengikut tertib menaik. Logik perbandingan ini dibenamkan dalam kelas Byte
, Character
, Long
, Integer
, Shor
, Double
, Float
.
Mari kita laksanakan perbandingan dalam kelas kita
Mari lihat contoh bagaimana anda boleh membina keupayaan untuk membandingkan objek ke dalam kelas anda. Apabila melaksanakancompareto
kaedah Java, kita boleh menentukan satu atau lebih kriteria untuk memesan objek, dan juga menggunakan kaedah compareto
daripada String
dan kelas Integer
. Sebagai contoh, untuk objek kelas User
kami menetapkan pengisihan mengikut nama, dan dalam kes nama yang sama, mengikut umur. Objek akan disusun mengikut susunan semula jadinya (apabila nilai meningkat). kelas User
:
public class User implements Comparable <User>{//добавляем возможность сравнивать an objectы User
private String name;
private Integer age;
private String email;
public User(String name, int age, String email) {
this.name = name;
this.age = age;
this.email = email;
}
@Override
//реализуем метод compareTo интерфейса Comparable
public int compareTo(User o) {
//используем метод compareTo из класса String для сравнения имен
int result = this.name.compareTo(o.name);
//если имена одинаковые - сравниваем возраст,
используя метод compareTo из класса Integer
if (result == 0) {
result = this.age.compareTo(o.age);
}
return result;
}
@Override
public String toString() {
return "{" +
"name='" + name + '\'' +
", age=" + age +
", email='" + email + '\'' +
'}';
}
Mari kita uji operasi kaedah compareTo
yang dilaksanakan dalam kelas User
menggunakan kaedah sort
kelas Collections
:
public static void main(String[] args) {
User user = new User("Andrey", 19, "andryha@mail.ru");
User user2 = new User("Олег", 25, "oleg@mail.ru");
User user3 = new User("Andrey", 24,"opr@google.com");
User user4 = new User("Igor", 16, "igor@mail.ru");
User user5 = new User("Andrey", 44,"stary@google.com");
List<User> list = new ArrayList<>();
list.add(user);
list.add(user2);
list.add(user3);
list.add(user4);
list.add(user5);
System.out.println("-------до сортировки--------");
for (User u : list) {
System.out.println(u);
}
System.out.println("-------после сортировки-----");
Collections.sort(list);
for (User u : list) {
System.out.println(u);
}
}
}
}
Hasil kaedah main
:
-------до сортировки--------
{name='Андрей', age=19, email='andryha@mail.ru'}
{name='Олег', age=25, email='oleg@mail.ru'}
{name='Андрей', age=24, email='opr@google.com'}
{name='Игорь', age=16, email='igor@mail.ru'}
{name='Андрей', age=44, email='stary@google.com'}
-------после сортировки-----
{name='Андрей', age=19, email='andryha@mail.ru'}
{name='Андрей', age=24, email='opr@google.com'}
{name='Андрей', age=44, email='stary@google.com'}
{name='Игорь', age=16, email='igor@mail.ru'}
{name='Олег', age=25, email='oleg@mail.ru'}
Jadi, mari kita ringkaskan. Jika anda seorang penyokong ketertiban dalam segala-galanya dan ingin menyusun objek anda dalam tatasusunan atau senarai tanpa kod yang tidak perlu, gunakan antara muka Comparable
. Pelaksanaan kaedah compareTo menjadikannya agak mudah untuk membina mekanisme untuk memesan objek secara semula jadi dalam kelas anda. Jika anda perlu bekerja dengan koleksi dan tatasusunan objek kelas standard yang diterangkan dalam pustaka Java, gunakan pelaksanaan siap sedia compareTo
dalam kelas ini.
GO TO FULL VERSION