JavaRush /Java Blog /Random-TL /ihambing Sa pamamaraan

ihambing Sa pamamaraan

Nai-publish sa grupo
Upang ayusin ang mga bagay na may parehong uri na naka-imbak sa isang array o koleksyon, ang mga developer ng Java ay gumawa ng Comparable. Ito ay nagpapahayag lamang ng isang paraan compareTo:
public interface Comparable<T> {
    public int compareTo(T o);
}
ihambing Sa pamamaraan - 1Ang isang interface Comparableay na-parameter ayon sa uri ng bagay na tinatanggap nito bilang isang parameter sa pamamaraan compareTo. Sa kasong ito, binabalaan namin ang compiler kung anong mga uri ng mga bagay ang aming ihahambing. Kung hindi natugunan ang kundisyon ng pagkakakilanlan ng uri, makakatanggap kami ng error ClassCastException. Ang isang pamamaraan compareTosa Java ay naghahambing ng object sa pagtawag sa object na ipinasa bilang isang parameter at nagbabalik ng isang integer bilang isang resulta ng paghahambing:
  • positibo kung ang tumatawag na bagay ay mas malaki kaysa sa bagay na ipinasa bilang isang parameter;
  • negatibo kung ang tumatawag na bagay ay mas maliit kaysa sa bagay na ipinasa bilang isang parameter;
  • null kung ang mga bagay ay pantay.
Ang pagsusulat ng lohika ng paghahambing ng bagay ay ang tanging alalahanin ng developer ng klase at natutukoy ng mga nais na resulta ng pag-order.

Bakit kailangan ng compareTo method sa Java?

Ang isang Java programmer ay madalas na humarap sa mga arrays at listahan ng mga bagay. Kapag nagtatrabaho sa malalaking halaga ng data, madalas na maginhawang iimbak ito sa isang organisado o pinagsunod-sunod na anyo. Una, pinapabilis nito ang pagtatrabaho sa koleksyon kapag naghahanap ng kinakailangang impormasyon, at pangalawa, ang organisadong data ay mas nakikitang mas nakikita.
ihambing Sa pamamaraan - 2
Ang isa sa pinakasimple at pinakaepektibong paraan upang pagbukud-bukurin ang isang hanay ng mga bagay ay ang pamamaraan sort()ng klase Arrays, at ang isang koleksyon ng mga bagay sa anyo ng isang listahan ay isang katulad na paraan ng klase Collections. Upang pag-uri-uriin gamit ang mga pamamaraang ito, binigyan kami ng mga developer ng Java ng kalayaan na pumili kung paano tukuyin ang pamantayan sa pag-uuri: sa pamamagitan ng pagpapatupad ng interface Comparablesa klase ng mga bagay na gusto naming pag-uri-uriin, o sa pamamagitan ng paggamit ng Comparator. Sa unang kaso, ang mga paraan ng pag-uuri ay tumatanggap ng isang hanay ng mga bagay sa anyo ng isang array o listahan:
sort(T[]array)//sorting массива
sort(List<T> list)// sorting списка
at sa pangalawa - kasama ang isa pang pagpapatupad ng interface Comparator:
sort(T[]array, Comparator <? super T> comparator)//sorting массива
sort(List<T> list, Comparator <? super T> comparator)// sorting списка
Ang interface Comparableay ginagamit kapag gusto naming magtakda ng natural (ang pinaka-lohikal mula sa aming pananaw) na pagkakasunud-sunod ng mga bagay kapag nag-uuri. Ito rin ay isang paraan upang "hardwire" ang algorithm para sa paghahambing ng mga bagay ng klase na ito sa yugto ng disenyo. Halimbawa, gamit ang pagpapatupad ng interface na ito, ang pamantayan para sa natural na pag-order sa mga klase ng wrapper ng mga pangunahing primitive na uri ay tinukoy: , , Byte, Character, Long, Integer, Short, Double, Float. Nangangahulugan din ito na ang mga klase na ito ay may ipinatupad na pamamaraan na magagamit natin sa programa kung kinakailangan. Tingnan natin ang isang halimbawa ng paghahambing ng string upang makita kung paano ipinapatupad ang pamamaraang ito sa klase . 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);
        }
    }
Kung ipapatupad namin ang code na ito sa pamamaraan main, makukuha namin ang sumusunod na resulta:
АAPOH
ААрон
Аарон
Берта
аАрон
аарон
берта
Tulad ng makikita mo sa halimbawa sa klase String, inaayos ng pamamaraan ang compareTomga string ayon sa alpabeto, lexicographically, at case-sensitive. Ito ang pagkakasunud-sunod ng paghahambing ng string na tinukoy ng mga developer ng klase Stringbilang natural. Para sa isang mas simpleng pag-unawa sa kung ano ang pagkakasunud-sunod ng leksikograpikal, sapat na alalahanin kung paano inayos ang mga salita sa mga diksyunaryo ng wika. Kapag naghahambing ng mga numero, ang mga bagay ay inayos sa pataas na pagkakasunud-sunod. Ang lohika ng paghahambing na ito ay naka-embed sa mga klase Byte, Character, Long, Integer, Shor, Double, Float.

Ipatupad natin ang paghahambing sa ating klase

Tingnan natin ang isang halimbawa kung paano mo mabubuo ang kakayahang maghambing ng mga bagay sa iyong klase. Kapag nagpapatupad ng isang comparetopamamaraan ng Java, maaari naming tukuyin ang isa o higit pang pamantayan para sa pag-order ng mga bagay, at gumamit din ng mga pamamaraan comparetomula sa Stringat mga klase Integer. Halimbawa, para sa mga bagay sa klase, Useritinakda namin ang pag-uuri ayon sa pangalan, at sa kaso ng magkaparehong mga pangalan, ayon sa edad. Ang mga bagay ay isasaayos sa kanilang natural na pagkakasunud-sunod (habang tumataas ang halaga). klase 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 + '\'' +
                '}';
    }
Subukan natin ang pagpapatakbo ng pamamaraang compareToipinatupad sa klase Usergamit ang pamamaraan sortng klase 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);
    }
}
 }
}
Resulta ng pamamaraan 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'}
Kaya, sabihin summarize. Kung ikaw ay isang tagasuporta ng kaayusan sa lahat ng bagay at nais mong ayusin ang iyong mga bagay sa isang array o listahan nang walang hindi kinakailangang code, gamitin ang interface Comparable. Ang pagpapatupad ng paraan ng compareTo nito ay ginagawang medyo madali ang pagbuo sa isang mekanismo para sa natural na pag-order ng mga bagay sa iyong klase. Kung kailangan mong magtrabaho sa mga koleksyon at array ng mga bagay ng karaniwang mga klase na inilarawan sa library ng Java, gumamit ng mga handa na pagpapatupad compareTosa mga klase na ito.
Mga komento
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION