JavaRush /Java блогы /Random-KK /салыстыру әдісі

салыстыру әдісі

Топта жарияланған
Массивте немесе жинақта сақталған бір типті нысандарды ұйымдастыру үшін Java әзірлеушілері Comparable. Ол тек бір әдісті жариялайды compareTo:
public interface Comparable<T> {
    public int compareTo(T o);
}
салыстыру әдісі - 1Интерфейс Comparableәдіске параметр ретінде қабылдайтын нысанның түрі бойынша параметрленеді compareTo. Бұл жағдайда біз компиляторға an objectілердің қандай түрлерін салыстыратынымызды ескертеміз. Егер түр сәйкестендіру шарты орындалмаса, біз қатені аламыз ClassCastException. Java тіліндегі әдіс compareToшақырушы нысанды параметр ретінде берілген нысанмен салыстырады және салыстыру нәтижесінде бүтін санды қайтарады:
  • егер шақырушы an object параметр ретінде берілген нысаннан үлкен болса оң;
  • егер шақырушы an object параметр ретінде берілген нысаннан кіші болса теріс;
  • нысандар тең болса null.
Объектіні салыстыру логикасын жазу класс әзірлеушісінің жалғыз мәселесі болып табылады және тапсырыстың қалаған нәтижелерімен анықталады.

Неліктен Java-да compareTo әдісі қажет?

Java бағдарламалаушысы жиі массивтермен және an objectілер тізімімен айналысады. Мәліметтердің үлкен көлемімен жұмыс істегенде, оны ұйымдасқан немесе сұрыпталған түрде сақтау жиі ыңғайлы. Біріншіден, ол қажетті ақпаратты іздеу кезінде жинақпен жұмыс істеуді тездетеді, екіншіден, ұйымдастырылған деректер визуалды түрде жақсы қабылданады.
салыстыру әдісі - 2
Объектілер массивін сұрыптаудың ең қарапайым және тиімді әдістерінің бірі sort()класс әдісі болып табылады Arrays, ал тізім түріндегі an objectілер жиынтығы ұқсас класс әдісі Collections. Осы әдістерді пайдалана отырып сұрыптау үшін Java әзірлеушілері сұрыптау критерийлерін қалай анықтау керектігін таңдау еркіндігін берді: интерфейсті Comparableсұрыптағымыз келетін нысандар класында енгізу арқылы немесе Comparator. Бірінші жағдайда сұрыптау әдістері массив немесе тізім түріндегі нысандар жиынын қабылдайды:
sort(T[]array)//sorting массива
sort(List<T> list)// sorting списка
және екіншісінде интерфейстің тағы бір іске асырылуы Comparator:
sort(T[]array, Comparator <? super T> comparator)//sorting массива
sort(List<T> list, Comparator <? super T> comparator)// sorting списка
Интерфейс Comparableсұрыптау кезінде an objectілердің табиғи (біздің көзқарасымыз бойынша ең логикалық) тәртібін орнатқымыз келгенде қолданылады. Бұл сондай-ақ жобалау сатысында осы класс an objectілерін салыстыру алгоритмін «қатты сыммен» қосу тәсілі. Мысалы, осы интерфейсті жүзеге асыру арқылы негізгі қарабайыр типтердің орауыш сыныптарында табиғи реттілік критерийлері анықталады: , Byte, Character, Long, Integer, Short, Double, Float, Boolean. Бұл сонымен қатар бұл сыныптарда қажет болған жағдайда бағдарламада қолдануға болатын Stringіске асырылған әдіс бар дегенді білдіреді . Бұл әдістің сыныпта қалай жүзеге асырылатынын көру үшін жолды салыстыруcompareTo мысалын қарастырайық . 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);
        }
    }
Бұл codeты әдісте орындасақ main, келесі нәтиже аламыз:
АAPOH
ААрон
Аарон
Берта
аАрон
аарон
берта
Класстағы мысалда көріп отырғаныңыздай String, әдіс compareToжолдарды алфавиттік, лексикографиялық және регистрді ескере отырып орналастырады. Дәл осы жолды салыстыру тәртібін класс әзірлеушілері Stringтабиғи деп анықтайды. Лексикографиялық тәртіптің не екенін оңайырақ түсіну үшін тілдік сөздіктерде сөздердің қалай орналасатынын еске түсіру жеткілікті. Сандарды салыстыру кезінде an objectілер өсу ретімен реттеледі. Бұл салыстыру логикасы , , , , , , , , , , , , , , , , , , , , , , , Byte, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , . CharacterLongIntegerShorDoubleFloat

Салыстыруды сабағымызда жүзеге асырайық

Нысандарды сыныпта салыстыру мүмкіндігін құрудың мысалын қарастырайық. Java әдісін енгізу кезінде comparetoбіз нысандарды ретке келтіру үшін бір немесе бірнеше критерийлерді белгілей аламыз, сондай-ақ және comparetoсыныптарындағы әдістерді пайдалана аламыз . Мысалы, сынып an objectілері үшін атау бойынша сұрыптауды, ал атаулар бірдей болған жағдайда жас бойынша сұрыптауды орнатамыз. Объектілер табиғи ретімен орналасады (мән өскен сайын). Сынып : 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 + '\'' +
                '}';
    }
Класс әдісі арқылы compareToсыныпта енгізілген әдістің жұмысын тексерейік : 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);
    }
}
 }
}
Әдістің нәтижесі 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'}
Сонымен, қорытындылайық. Егер сіз барлық нәрседе тәртіпті жақтасаңыз және an objectілеріңізді массивте немесе тізімде қажетсіз codeсыз реттегіңіз келсе, интерфейсті пайдаланыңыз Comparable. Оның compareTo әдісін іске асыру сыныптағы an objectілерді табиғи ретке келтіру механизмін құруды айтарлықтай жеңілдетеді. compareToJava кітапханасында сипатталған стандартты класстардың an objectілерінің жинақтарымен және массивтерімен жұмыс істеу керек болса, осы сыныптарда дайын іске асыруларды пайдаланыңыз .
Пікірлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION