JavaRush /Java блогу /Random-KY /салыштыруу ыкмасы

салыштыруу ыкмасы

Группада жарыяланган
Массивде же коллекцияда сакталган бир типтеги an objectтерди уюштуруу үчүн Java иштеп чыгуучулары Comparable. Ал бир гана ыкманы жарыялайт compareTo:
public interface Comparable<T> {
    public int compareTo(T o);
}
салыштыруу ыкмасы - 1Интерфейс Comparableметоддун параметри катары кабыл алган an objectтин түрү боюнча параметрленет compareTo. Бул учурда, биз компиляторго an objectтердин кандай түрлөрүн салыштыра турганыбызды эскертебиз. Эгерде типти аныктоо шарты аткарылбаса, биз ката алабыз ClassCastException. Javaдагы метод compareToчакыруучу an objectти параметр катары берилген an object менен салыштырат жана салыштыруунун натыйжасында бүтүн санды кайтарат:
  • эгерде чакыруучу an object параметр катары берилген an objectтен чоңураак болсо оң;
  • терс, эгерде чакыруучу an object параметр катары берилген an objectтен кичине болсо;
  • an objectтер бирдей болсо, null.
Объектти салыштыруу логикасын жазуу классты иштеп чыгуучунун жападан жалгыз иши жана тартиптин каалаган натыйжалары менен аныкталат.

Эмне үчүн салыштыруу ыкмасы Java үчүн керек?

Java программисти көбүнчө массивдер жана an objectтердин тизмелери менен иштеши керек. Чоң көлөмдөгү маалыматтар менен иштөөдө аны уюшкан же иреттелген түрдө сактоо көбүнчө ыңгайлуу. Биринчиден, керектүү маалыматты издөөдө коллекция менен иштөөнү тездетет, экинчиден, уюшулган маалыматтар визуалдык жактан жакшыраак кабыл алынат.
салыштыруу ыкмасы - 2
Объекттердин массивдерин иреттөөнүн эң жөнөкөй жана эң эффективдүү жолдорунун бири sort()класс методу Arrays, ал эми тизме түрүндөгү an objectтердин жыйындысы окшош класстык метод болуп саналат Collections. Бул ыкмаларды колдонуу менен сорттоо үчүн, Java иштеп чыгуучулары бизге сорттоо критерийлерин кантип аныктоону тандоо эркиндигин беришти: биз Comparableсорттогубуз келген an objectтердин классында интерфейсти ишке ашыруу же Comparator. Биринчи учурда, сорттоо ыкмалары массив же тизме түрүндөгү an objectтердин жыйындысын кабыл алат:
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, Character, , Long, , Integer, , , , Shor, , , Double, Float, .

Салыштырууну классыбызда ишке ашыралы

Классыңызда an objectтерди салыштыруу жөндөмүңүздү кантип түзө аларыңыздын мисалын карап көрөлү. Java ыкмасын ишке ашырууда comparetoбиз an objectтерди иреттөө үчүн бир же бир нече критерийлерди белгилей алабыз, ошондой эле жана 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илерди табигый иреттөө механизмин түзүүнү абдан жеңилдетет. Java китепканасында сүрөттөлгөн стандарттык класстардын an objectтеринин коллекциялары жана массивдери менен иштөөгө туура келсе, compareToбул класстарда даяр ишке ашырууларды колдонуңуз.
Комментарийлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION