JavaRush /Java Blogu /Random-AZ /müqayisə üsulu

müqayisə üsulu

Qrupda dərc edilmişdir
Massivdə və ya kolleksiyada saxlanılan eyni tipli obyektləri təşkil etmək üçün Java tərtibatçıları Comparable. Yalnız bir metodu elan edir compareTo:
public interface Comparable<T> {
    public int compareTo(T o);
}
müqayisə üsulu - 1İnterfeys Comparablemetodun parametri kimi qəbul etdiyi obyektin növü ilə parametrləşdirilir compareTo. Bu halda biz kompilyatora hansı tip obyektləri müqayisə edəcəyimizi xəbərdar edirik. Əgər növün identifikasiyası şərti yerinə yetirilmirsə, xəta alacağıq ClassCastException. Java-da metod compareToçağıran obyekti parametr kimi ötürülən obyektlə müqayisə edir və müqayisə nəticəsində tam ədədi qaytarır:
  • çağıran obyekt parametr kimi verilən obyektdən böyükdürsə müsbət;
  • çağıran obyekt parametr kimi ötürülən obyektdən kiçikdirsə mənfi;
  • obyektlər bərabər olduqda null.
Obyektlərin müqayisəsi məntiqinin yazılması sinif tərtibatçısının yeganə işidir və sifarişin istənilən nəticələri ilə müəyyən edilir.

Niyə Java-da compareTo metoduna ehtiyac var?

Java proqramçısı çox vaxt massivlər və obyektlərin siyahıları ilə məşğul olur. Böyük həcmli məlumatlarla işləyərkən, onları mütəşəkkil və ya çeşidlənmiş formada saxlamaq çox vaxt rahatdır. Birincisi, lazımi məlumatları axtararkən kolleksiya ilə işləməyi sürətləndirir, ikincisi, təşkil edilmiş məlumatlar vizual olaraq daha yaxşı qəbul edilir.
müqayisə üsulu - 2
Obyektlər massivinin çeşidlənməsinin ən sadə və effektiv üsullarından biri sort()sinif metodudur Arraysvə siyahı şəklində olan obyektlərin toplusu isə oxşar sinif metodudur Collections. Bu üsullardan istifadə edərək çeşidləmək üçün Java tərtibatçıları bizə çeşidləmə meyarlarını necə təyin edəcəyimizi seçmək azadlığı verdilər: interfeysi Comparableçeşidləmək istədiyimiz obyektlər sinfində tətbiq etməklə və ya Comparator. Birinci halda, çeşidləmə metodları massiv və ya siyahı şəklində bir sıra obyektləri qəbul edir:
sort(T[]array)//sorting массива
sort(List<T> list)// sorting списка
və ikinci üstəgəl interfeysin başqa bir tətbiqi Comparator:
sort(T[]array, Comparator <? super T> comparator)//sorting массива
sort(List<T> list, Comparator <? super T> comparator)// sorting списка
İnterfeys Comparableçeşidləmə zamanı obyektlərin təbii (bizim nöqteyi-nəzərimizdən ən məntiqli) sırasını təyin etmək istədiyimiz zaman istifadə olunur. Bu, həm də dizayn mərhələsində bu sinif obyektlərini müqayisə etmək üçün alqoritmi “sabit tellə bağlamaq” üsuludur. Məsələn, bu interfeysin həyata keçirilməsindən istifadə edərək, əsas primitiv növlərin sarğı siniflərində təbii sıralanma meyarları müəyyən edilir: , Byte, Character, Long, Integer, Short, Double, Float, Boolean. Bu həm də o deməkdir ki, bu siniflərdə lazım gəldikdə proqramda istifadə edə biləcəyimiz Stringhəyata keçirilmiş metod var . Bu metodun sinifdə necə tətbiq olunduğunu görmək üçün sətirlərin müqayisəsicompareTo nümunəsinə baxaq . 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);
        }
    }
Bu kodu metodda icra etsək main, aşağıdakı nəticəni alacağıq:
АAPOH
ААрон
Аарон
Берта
аАрон
аарон
берта
Sinifdəki misalda gördüyünüz kimi String, üsul compareTosətirləri əlifba, leksikoqrafik və hərf hərfinə həssaslıqla düzür. StringSinfin tərtibatçıları tərəfindən təbii olaraq təyin olunan simli müqayisənin bu sırasıdır . Leksikoqrafiya sırasının nə olduğunu daha sadə başa düşmək üçün dil lüğətlərində sözlərin necə düzüldüyünü xatırlamaq kifayətdir. Rəqəmləri müqayisə edərkən cisimlər artan ardıcıllıqla sıralanır. ByteBu müqayisə məntiqi , Character, Long, , Integer, Shor, Double, siniflərində yerləşdirilmişdir Float.

Müqayisəni sinfimizdə həyata keçirək

Öz sinifinizdə obyektləri müqayisə etmək bacarığını necə qura biləcəyiniz nümunəsinə baxaq. Java metodunu tətbiq edərkən comparetobiz obyektlərin sifarişi üçün bir və ya bir neçə meyar təyin edə, həmçinin və comparetosiniflərindən metodlardan istifadə edə bilərik . Məsələn, sinif obyektləri üçün adla, eyni adlar olduqda isə yaşa görə çeşidləmə təyin edirik. Obyektlər təbii qaydada yerləşdiriləcək (dəyər artdıqca). Sinif : 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 + '\'' +
                '}';
    }
Sinif metodundan istifadə edərək compareTosinifdə tətbiq olunan metodun işini yoxlayaq : 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);
    }
}
 }
}
Metodun nəticəsi 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'}
Beləliklə, ümumiləşdirək. Əgər siz hər şeydə nizamın tərəfdarısınızsa və obyektlərinizi lazımsız kod olmadan massiv və ya siyahıda yerləşdirmək istəyirsinizsə, interfeysdən istifadə edin Comparable. Onun compareTo metodunun tətbiqi sinifinizdə obyektləri təbii qaydada sifariş etmək üçün mexanizm qurmağı çox asanlaşdırır. Java kitabxanasında təsvir edilmiş standart sinif obyektlərinin kolleksiyaları və massivləri ilə işləmək məcburiyyətindəsinizsə, compareTobu siniflərdə hazır tətbiqlərdən istifadə edin.
Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION