JavaRush /Блоги Java /Random-TG /усули муқоиса

усули муқоиса

Дар гурӯҳ нашр шудааст
Барои ташкor an objectҳои як намуди дар массив ё коллексия нигоҳ дошташуда, таҳиягарони Java бо Comparable. Он танҳо як усулро эълон мекунад compareTo:
public interface Comparable<T> {
    public int compareTo(T o);
}
Усули муқоиса - 1Интерфейс Comparableаз рӯи намуди an objectе, ки ҳамчун параметр ба усул қабул мекунад, параметр карда мешавад compareTo. Дар ин ҳолат, мо компиляторро огоҳ мекунем, ки кадом намуди an objectҳоро муқоиса мекунем. Агар шарти мушаххаси намуд иҷро нашавад, мо хатогиро мегирем ClassCastException. Усул compareToдар Java an objectи даъватшавандаро бо an objectе, ки ҳамчун параметр дода шудааст, муқоиса мекунад ва дар натиҷаи муқоиса адади бутунро бармегардонад:
  • мусбат, агар an objectи даъваткунанда аз an objectи ҳамчун параметр қабулшуда калонтар бошад;
  • манфӣ агар an objectи даъваткунанда аз an objectи ҳамчун параметр қабулшуда хурдтар бошад;
  • нул агар an objectҳо баробар бошанд.
Навиштани мантиқи муқоисаи an object танҳо нигаронии таҳиягари синф аст ва аз рӯи натиҷаҳои дилхоҳи фармоиш муайян карда мешавад.

Чаро дар Java усули compareTo лозим аст?

Барномасози Java аксар вақт бояд бо массивҳо ва рӯйхатҳои an objectҳо кор кунад. Ҳангоми кор бо миқдори зиёди маълумот, аксар вақт нигоҳ доштани он дар шакли муташаккил ё мураттабшуда қулай аст. Якум, он ҳангоми ҷустуҷӯи иттилооти зарурӣ кор бо коллексияро суръат мебахшад ва дуюм, маълумоти муташаккил аз ҷиҳати визуалӣ беҳтар қабул карда мешавад.
Усули муқоиса - 2
Яке аз соддатарин ва муассиртарин усулҳои ҷудо кардани массивҳои an objectҳо усули 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. Ин инчунин маънои онро дорад, ки ин синфҳо усули амалӣ доранд , ки мо метавонем дар ҳолати зарурӣ дар барнома истифода барем. Биёед мисоли муқоисаи сатрро бубинем , то бубинем, ки ин усул дар синф чӣ гуна татбиқ карда мешавад . 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);
        }
    }
Агар мо ин codeро дар метод иҷро кунем main, мо натиҷаи зеринро мегирем:
АAPOH
ААрон
Аарон
Берта
аАрон
аарон
берта
Тавре ки шумо дар мисоли синф мебинед String, ин усул compareToсатрҳоро аз рӯи алифбо, лексикографӣ ва ҳассос ба ҳарфҳо ҷойгир мекунад. Маҳз ҳамин тартиби муқоисаи сатрро таҳиягарони синф Stringҳамчун табиӣ муайян мекунанд. Барои соддатар фаҳмидани тартиби лексикографӣ, ёдоварӣ кардан кифоя аст, ки калимаҳо дар луғатҳои забон чӣ гуна ҷойгир шудаанд. Ҳангоми муқоисаи рақамҳо, an objectҳо бо тартиби афзоиш тартиб дода мешаванд. Ин мантиқи муқоисавӣ дар синфҳои Byte, Character, Long, Integer, Shor, Double, ҷойгир карда шудааст Float.

Биёед дар синфи худ муқоисаро амалӣ кунем

Биёед мисолеро бубинем, ки чӣ тавр шумо қобorяти муқоисаи an objectҳоро дар синфи худ эҷод карда метавонед. Ҳангоми татбиқи comparetoусули Java, мо метавонем як ё якчанд меъёрҳоро барои фармоиши an objectҳо муайян кунем ва инчунин усулҳоро comparetoаз Stringва синфҳо истифода барем Integer. Масалан, барои an objectҳои синфӣ Userмо ҷудокуниро аз рӯи ном ва дар сурати баробар будани номҳо аз рӯи синну сол муқаррар мекунем. Объектҳо бо тартиби табиии худ ҷойгир карда мешаванд (бо афзоиши арзиш). Синф 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 + '\'' +
                '}';
    }
Биёед кори усулеро, compareToки дар синф Userбо истифода аз усули sortсинф амалӣ карда мешавад, санҷем 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);
    }
}
 }
}
Натиҷаи усул 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ҳои худро дар массив ё рӯйхат бе рамзи нолозим ҷойгир кунед, интерфейсро истифода баред Comparable. Татбиқи усули муқоисавии он сохтани механизми ба таври табиӣ фармоиш додани an objectҳоро дар синфи худ хеле осон мекунад. compareToАгар ба шумо лозим меояд, ки бо коллексияҳо ва массивҳои an objectҳои синфҳои стандартӣ, ки дар китобхонаи Java тавсиф шудаанд, кор кунед, дар ин синфҳо татбиқи тайёрро истифода баред .
Шарҳҳо
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION