JavaRush /Java blogi /Random-UZ /solishtirish usuli

solishtirish usuli

Guruhda nashr etilgan
Massiv yoki kollektsiyada saqlangan bir xil turdagi ob'ektlarni tartibga solish uchun Java dasturchilari Comparable. U faqat bitta usulni e'lon qiladi compareTo:
public interface Comparable<T> {
    public int compareTo(T o);
}
solishtirish usuli - 1Interfeys, Comparableu usulga parametr sifatida qabul qilgan ob'ekt turiga qarab parametrlanadi compareTo. Bunday holda, biz kompilyatorni qaysi turdagi ob'ektlarni solishtirmoqchi ekanligimiz haqida ogohlantiramiz. Agar tur identifikatori sharti bajarilmasa, biz xato qilamiz ClassCastException. Java'dagi usul compareTochaqiruvchi ob'ektni parametr sifatida berilgan ob'ekt bilan taqqoslaydi va taqqoslash natijasida butun sonni qaytaradi:
  • agar chaqiruvchi ob'ekt parametr sifatida berilgan ob'ektdan katta bo'lsa ijobiy;
  • agar chaqiruvchi ob'ekt parametr sifatida berilgan ob'ektdan kichik bo'lsa salbiy;
  • ob'ektlar teng bo'lsa null.
Ob'ektni taqqoslash mantig'ini yozish sinf ishlab chiquvchisining yagona ishidir va buyurtmaning istalgan natijalari bilan belgilanadi.

Nima uchun Java'da compareTo usuli kerak?

Java dasturchisi ko'pincha massivlar va ob'ektlar ro'yxati bilan shug'ullanishi kerak. Katta hajmdagi ma'lumotlar bilan ishlashda ularni tartiblangan yoki tartiblangan shaklda saqlash qulay. Birinchidan, kerakli ma'lumotlarni qidirishda to'plam bilan ishlashni tezlashtiradi, ikkinchidan, tashkil etilgan ma'lumotlar vizual ravishda yaxshiroq qabul qilinadi.
solishtirish usuli - 2
Ob'ektlar massivini saralashning eng oddiy va samarali usullaridan biri bu sort()sinf usuli Arrays, ro'yxat ko'rinishidagi ob'ektlar to'plami esa shunga o'xshash sinf usulidir Collections. Ushbu usullardan foydalangan holda saralash uchun Java dasturchilari bizga tartiblash mezonlarini qanday belgilashni tanlash erkinligini berdilar: interfeysni biz Comparablesaralashni xohlagan ob'ektlar sinfida amalga oshirish yoki Comparator. Birinchi holda, saralash usullari ob'ektlar to'plamini massiv yoki ro'yxat shaklida qabul qiladi:
sort(T[]array)//sorting массива
sort(List<T> list)// sorting списка
va ikkinchisida - ortiqcha interfeysning yana bir amalga oshirilishi Comparator:
sort(T[]array, Comparator <? super T> comparator)//sorting массива
sort(List<T> list, Comparator <? super T> comparator)// sorting списка
Interfeys Comparablebiz saralashda ob'ektlarning tabiiy (bizning nuqtai nazarimizdan eng mantiqiy) tartibini o'rnatmoqchi bo'lganimizda ishlatiladi. Bu, shuningdek, dizayn bosqichida ushbu sinf ob'ektlarini taqqoslash algoritmini "qattiq simli" qilish usulidir. Masalan, ushbu interfeysni amalga oshirishdan foydalanib, asosiy ibtidoiy turlarning o'rash sinflarida tabiiy tartiblash mezonlari aniqlanadi : , Byte, Character, Long, Integer, Short, Double, Float. Bu shuni anglatadiki, bu sinflarda kerak bo'lganda dasturda foydalanishimiz mumkin bo'lgan amalga oshirilgan usul mavjud. Ushbu usul sinfda qanday qo'llanilishini ko'rish uchun satrlarni taqqoslash misolini ko'rib chiqaylik . BooleanStringcompareToString
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);
        }
    }
Agar biz ushbu kodni usulida bajarsak main, biz quyidagi natijaga erishamiz:
АAPOH
ААрон
Аарон
Берта
аАрон
аарон
берта
Sinfdagi misolda ko'rib turganingizdek String, usul compareTosatrlarni alifbo, leksikografik va katta-kichik harflarga qarab tartibga soladi. Sinf ishlab chiquvchilari tomonidan Stringtabiiy deb belgilangan qatorlarni taqqoslashning mana shu tartibi. Leksikografik tartib nima ekanligini soddaroq tushunish uchun til lug'atlarida so'zlarning qanday joylashishini eslab qolish kifoya. Raqamlarni taqqoslashda ob'ektlar o'sish tartibida tartibga solinadi. Bu taqqoslash mantig'i , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , Byte, , Character, , Long, , , , Integer, , , , , , , , , , , , Shor, , , Double, , sinflar ichiga kiritilgan Float.

Keling, sinfimizda taqqoslashni amalga oshiramiz

Keling, sinfingizdagi ob'ektlarni solishtirish qobiliyatini qanday yaratishingiz mumkinligi haqidagi misolni ko'rib chiqaylik. Java usulini amalga oshirishda comparetobiz ob'ektlarni buyurtma qilish uchun bir yoki bir nechta mezonlarni belgilashimiz mumkin, shuningdek, va comparetosinflaridan usullardan foydalanishimiz mumkin . Masalan, sinf ob'ektlari uchun biz nomlar bo'yicha, nomlar teng bo'lsa, yosh bo'yicha tartiblashni o'rnatamiz. Ob'ektlar tabiiy tartibda joylashtiriladi (qiymat ortishi bilan). Sinf : StringIntegerUserUser
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 + '\'' +
                '}';
    }
Sinf usuli yordamida compareTosinfda amalga oshirilgan usulning ishlashini sinab ko'raylik : UsersortCollections
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);
    }
}
 }
}
Usulning natijasi 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'}
Shunday qilib, keling, xulosa qilaylik. Agar siz hamma narsada tartib tarafdori bo'lsangiz va ob'ektlaringizni massiv yoki ro'yxatda keraksiz kodsiz tartibga solishni istasangiz, interfeysdan foydalaning Comparable. Uning compareTo usulini amalga oshirish sizning sinfingizdagi ob'ektlarni tabiiy tartiblash mexanizmini yaratishni juda oson qiladi. Agar siz Java kutubxonasida tasvirlangan standart sinf ob'ektlari to'plamlari va massivlari bilan ishlashingiz kerak bo'lsa, compareToushbu sinflarda tayyor ilovalardan foydalaning.
Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION