JavaRush /Blog Java /Random-MS /kaedah compareTo

kaedah compareTo

Diterbitkan dalam kumpulan
Untuk menyusun objek dari jenis yang sama yang disimpan dalam tatasusunan atau koleksi, pembangun Java menghasilkan Comparable. Ia mengisytiharkan hanya satu kaedah compareTo:
public interface Comparable<T> {
    public int compareTo(T o);
}
kaedah compareTo - 1Antara muka Comparablediparameterkan 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 compareTodalam 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.
Menulis logik perbandingan objek adalah kebimbangan tunggal pembangun kelas dan ditentukan oleh hasil pesanan yang dikehendaki.

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.
kaedah compareTo - 2
Salah satu cara yang paling mudah dan berkesan untuk mengisih tatasusunan objek ialah kaedah 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 Comparabledalam 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 Comparabledigunakan 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. StringIni juga bermakna bahawa kelas ini mempunyai kaedah yang dilaksanakan compareToyang 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 compareTomenyusun rentetan mengikut abjad, leksikografik dan sensitif huruf besar-besaran. Susunan perbandingan rentetan inilah yang ditakrifkan oleh pembangun kelas Stringsebagai 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 melaksanakan comparetokaedah Java, kita boleh menentukan satu atau lebih kriteria untuk memesan objek, dan juga menggunakan kaedah comparetodaripada Stringdan kelas Integer. Sebagai contoh, untuk objek kelas Userkami 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 compareToyang dilaksanakan dalam kelas Usermenggunakan kaedah sortkelas 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 compareTodalam kelas ini.
Komen
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION