Comparable vs Comparator in Java

Fล‘bb kรผlรถnbsรฉg az รถsszehasonlรญthatรณ รฉs az รถsszehasonlรญtรณ kรถzรถtt Java

  • ร–sszehasonlรญthatรณ Java egy objektum, amellyel รถsszehasonlรญthatja magรกt egy mรกsik objektummal, mรญg a Comparator egy olyan objektum, amely kรผlรถnbรถzล‘ osztรกlyokba tartozรณ objektumokat hasonlรญt รถssze.
  • ร–sszehasonlรญthatรณ biztosรญtja a compareTo() az elemek rendezรฉsรฉnek mรณdja Java, mรญg a Comparator a compare() az elemek rendezรฉsรฉnek mรณdja Java.
  • Hasonlรณ interfรฉsz talรกlhatรณ benne java.lang csomagban, mรญg a Comparator interfรฉsz benne van java.util csomag.
  • A Comparable egyetlen rendezรฉsi sorozatot, mรญg a Comparator tรถbb rendezรฉsi sorozatot biztosรญt.
  • A Comparator hatรกssal van az eredeti osztรกlyra, mรญg a Comparator nem az eredeti osztรกlyra.

Kรผlรถnbsรฉg az รถsszehasonlรญthatรณ รฉs az รถsszehasonlรญtรณ kรถzรถtt
Kรผlรถnbsรฉg az รถsszehasonlรญthatรณ รฉs az รถsszehasonlรญtรณ kรถzรถtt

Itt elemeztem az รถsszehasonlรญthatรณ รฉs a Comparator kรถzรถtti kรผlรถnbsรฉget, รฉs รกtfogรณan รฉrtรฉkelem azok elล‘nyeit รฉs hรกtrรกnyait.

Amiben รถsszehasonlรญthatรณ Java?

Hasonlรณ in Java olyan tรกrgy, amely รถsszehasonlรญtja magรกt egy mรกsik tรกrggyal. Segรญt az egyรฉni objektumok listรกjรกnak rendezรฉsรฉben. A Java.lang.Az รถsszehasonlรญthatรณ felรผletet egy osztรกlynak kell megvalรณsรญtania, hogy รถsszehasonlรญthassa pรฉldรกnyait. Az รถsszehasonlรญthatรณ interfรฉszt megvalรณsรญtรณ objektumok tรถmbje automatikusan sorba rendezล‘dik Arrays.sort รฉs a Collections.sort mรณd.

Az ร–sszehasonlรญtรกsban hasznรกlt mรณdszer

Szeretnรฉk kiemelni egy fontos mรณdszert, amelyet gyakran hasznรกlok a Comparable felรผleten:

ร–sszehasonlรญtani():

A CompareTo() metรณdus termรฉszetes rendezรฉst hajt vรฉgre egy karakterlรกncon. A termรฉszetes rendezรฉs jelentรฉse az objektumra รฉrvรฉnyes rendezรฉsi sorrend, pl. az egรฉsz szรกmok rendezรฉsรฉnek numerikus sorrendje, a String betลฑrendje stb.

A szintaxisa CompareTo() a mรณdszer a kรถvetkezล‘:

int compareTo(T obj)

A fenti szintaxisban a T az รถsszehasonlรญtandรณ objektumok tรญpusรกt jelรถli.

CompareTo() mรณdszer รถsszehasonlรญtja az objektumot T obj-val.

output:

  • 0-t ad vissza, ha az รฉrtรฉkek egyenlล‘ek.
  • Ha az objektum รฉrtรฉke alacsonyabb, akkor ez a metรณdus negatรญv รฉrtรฉket ad vissza.
  • Ha az objektumnak nagyobb az รฉrtรฉke, akkor pozitรญv รฉrtรฉket ad vissza.

Pรฉlda รถsszehasonlรญtรกsra in Java

A kรถvetkezล‘ program a Java egy รถsszehasonlรญthatรณ pรฉlda kรฉt karakter, โ€žaโ€ รฉs โ€žbโ€ รถsszehasonlรญtรกsรกt mutatja be. Az โ€žaโ€ karakter รกbรฉcรฉ sorrendben โ€žbโ€ elรฉ kerรผl.

Ezรฉrt a kimenet -1. A โ€žbโ€ karakter az โ€žaโ€ utรกn kรถvetkezik รกbรฉcรฉ sorrendben. Ezรฉrt a kimenet 1. Az โ€žaโ€ รฉs โ€žbโ€ karakterek egyenรฉrtรฉkลฑek. Ezรฉrt a kimenet 0.

public class Sample_String {
    public static void main(String[] args) {
        String str_Sample = "a";
        System.out.println("Compare To 'a' b is : " + str_Sample.compareTo("b"));
        str_Sample = "b";
        System.out.println("Compare To 'b' a is : " + str_Sample.compareTo("a"));
        str_Sample = "b";
        System.out.println("Compare To 'b' b is : " + str_Sample.compareTo("b"));
    }
}

teljesรญtmรฉny

Compare To 'a' b is : -1
Compare To 'b' a is : 1
Compare To 'b' b is : 0

Miben van รถsszehasonlรญtรณ Java?

ร–sszehasonlรญtรณ in Java egy objektum a kรผlรถnbรถzล‘ osztรกlyokhoz tartozรณ objektumok รถsszehasonlรญtรกsรกra. Az รถsszehasonlรญtรณ interfรฉsz be Java a felhasznรกlรณ รกltal definiรกlt osztรกlyok objektumainak rendezรฉsรฉre is szolgรกl. Kรฉt fontos รถsszehasonlรญtรณ interfรฉsz mรณdszert tartalmaz, amelyek az รถsszehasonlรญtรกs (Object obj1, Object obj2) รฉs az egyenlล‘k (Object element) nรฉven ismertek.

A Comparatorban hasznรกlt mรณdszer

Gyakorlatomban gyakran tรกmaszkodom az รถsszehasonlรญtรณ felรผlet alรกbbi kritikus mรณdszereire:

ร–sszehasonlรญtรกs():

Compare() lehetล‘vรฉ teszi az objektumok megrendelรฉsรฉt. Ehhez lรฉtre kell hozni egy osztรกlyt, amely egy รถsszehasonlรญtรณ felรผletet valรณsรญt meg. Ezt kรถvetล‘en felรผl kell รญrnia az รถsszehasonlรญtรกsi mรณdszert.

A szintaxis a compare() a mรณdszer a kรถvetkezล‘:

compare(Object obj1, Object obj2)

A fenti szintaxisban az obj1 รฉs az obj2 kรฉt olyan objektum, amelyeket รถssze kell hasonlรญtani az รถsszehasonlรญtรกs() metรณdussal. compare() mรณdszer.

output:

  • Negatรญv egรฉsz szรกmot ad vissza, ha az elsล‘ argumentum kisebb, mint a mรกsodik.
  • Nullรกt ad vissza, ha az elsล‘ argumentum รฉs a mรกsodik argumentum egyenlล‘.
  • Ez a mรณdszer pozitรญv egรฉsz szรกmot adhat vissza, ha az elsล‘ argumentum nagyobb, mint a mรกsodik.

Biztosรญtania kell, hogy a kapcsolat tranzitรญv legyen. Pรฉldรกul ((hasonlรญtsa รถssze(a, b)>0) && (hasonlรญtsa รถssze(b, c)>0)), ami azt jelenti, hogy รถsszehasonlรญtsa(a, c)>0.

Pรฉlda รถsszehasonlรญtรกsra in Java

Az alรกbbiakban Java รถsszehasonlรญtรณ pรฉlda, 6 van vรกltozรณk. โ€žxโ€, โ€žyโ€, โ€žpโ€, โ€žqโ€, โ€žrโ€ รฉs โ€žsโ€. A kimenet -1, mint az โ€žxโ€ รฉrtรฉke, a 20 kisebb, mint az โ€žyโ€, 30. A kimenet 0, mert a โ€žpโ€ รฉrtรฉke, 40 egyenlล‘ โ€žqโ€ รฉrtรฉkรฉvel, 40 .

import java.lang.Integer; 
public class example { 
    public static void main(String args[]) 
    { 
        int x = 20; 
        int y = 30; 
        // as 10 less than 20, 
        // Output will be a value less than zero 
        System.out.println(Integer.compare(x, y)); 
        int p = 40; 
        int q = 40; 
        // as 30 equals 30, 
        // Output will be zero 
        System.out.println(Integer.compare(p, q)); 
        int r = 20; 
        int s = 7; 
        // as 15 is greater than 8, 
        // Output will be a value greater than zero 
        System.out.println(Integer.compare(r, s)); 
    } 
}

output:

-1
0
1

Egyenlล‘():

Equals() ellenล‘rzi, hogy a szรกmobjektum egyenlล‘-e az argumentumkรฉnt รกtadott objektummal vagy sem.

A szintaxis a equals() a mรณdszer a kรถvetkezล‘:

public boolean equals(Object o)

Ez a metรณdus kรฉt paramรฉtert igรฉnyel: 1) bรกrmely objektumot รฉs 2) egy visszatรฉrรฉsi รฉrtรฉket. Igazat ad vissza, ha az รกtadott argumentum nem null, รฉs egy hasonlรณ tรญpusรบ objektum, amely azonos numerikus รฉrtรฉkkel rendelkezik.

Pรฉlda az egyenlล‘ mรณdszerre:

Az alรกbbi pรฉldรกban a nรฉgy vรกltozรณt fogom รถsszehasonlรญtani egymรกssal. Hรกrom vรกltozรณ integer tรญpusรบ, egy pedig rรถvid tรญpusรบ. Az elsล‘ eredmรฉny hamis, mivel p รฉrtรฉke, amely 5, nem egyenlล‘ q รฉrtรฉkรฉvel, amely 20.

A mรกsodik eredmรฉny igaz, mert a p รฉs r vรกltozรณ รฉrtรฉke megegyezik, ami 5. Vรฉgรผl a kimenet hamis, mivel a p รฉs az s vรกltozรณk eltรฉrล‘ รฉrtรฉkkel rendelkeznek.

public class Test { 
   public static void main(String args[]) {
      Integer p = 5;
      Integer q = 20;
      Integer r =5;
      Short s = 5;
      System.out.println(p.equals(q));  
      System.out.println(p.equals(r)); 
      System.out.println(p.equals(s));
   }
}

teljesรญtmรฉny

false
true
false

Az รถsszehasonlรญthatรณ รฉs az รถsszehasonlรญtรณ kรถzรถtti kรผlรถnbsรฉgek Java

Gyakran lรกtom a zavart a kettล‘ kรถzรถtt Java ร–sszehasonlรญthatรณ รฉs รถsszehasonlรญtรณ; itt van a fล‘ kรผlรถnbsรฉg:

Kรผlรถnbsรฉg az รถsszehasonlรญthatรณ รฉs az รถsszehasonlรญtรณ kรถzรถtt Java
Kรผlรถnbsรฉg az รถsszehasonlรญthatรณ รฉs az รถsszehasonlรญtรณ kรถzรถtt Java

ร–sszehasonlรญtรกsi alap Hasonlรณ ร–sszehasonlรญtรณ
Mรณdszer ร–sszehasonlรญthatรณ nyรบjt compareTo() az elemek rendezรฉsรฉnek mรณdja Java. A Comparator biztosรญtja compare() az elemek rendezรฉsรฉnek mรณdja Java.
Csomag Hasonlรณ interfรฉsz talรกlhatรณ benne java.lang csomag. ร–sszehasonlรญtรณ interfรฉsz talรกlhatรณ benne java.util csomag.
A rendezรฉs logikรกja A rendezรฉs logikรกjรกnak ugyanabban az osztรกlyban kell lennie, mint a rendezni kรญvรกnt objektumnak. A rendezรฉs logikรกjรกnak kรผlรถn osztรกlyokban kell lennie, hogy kรผlรถnbรถzล‘ rendezรฉseket รญrhasson az objektumok kรผlรถnbรถzล‘ attribรบtumai alapjรกn.
Osztรกly objektum Annak az osztรกlynak, amelynek objektumait rendezni szeretnรฉ, meg kell valรณsรญtania az ร–sszehasonlรญthatรณ felรผletet. Egy osztรกlynak, amelynek objektumait rendezni szeretnรฉ, nem kell รถsszehasonlรญtรณ felรผletet megvalรณsรญtania.
Sorozatok rendezรฉse Egyetlen rendezรฉsi szekvenciรกt biztosรญt. Tรถbb rendezรฉsi szekvenciรกt biztosรญt.
Rendezรฉsi sorrend Ezzel a mรณdszerrel a termรฉszetes rendezรฉsi sorrend szerint rendezhetล‘k az adatok. Ez a mรณdszer a testreszabott rendezรฉsi sorrend szerint rendezi az adatokat.
Osztรกly Az eredeti osztรกlyt รฉrinti. azaz a tรฉnyleges osztรกly megvรกltozik. Nincs hatรกssal az eredeti osztรกlyra, azaz a tรฉnyleges osztรกly nem mรณdosul.
Hasznรกlat Gyakran implementรกlva az API-ban a Naptรกr, a Wrapper osztรกlyok, a dรกtum รฉs a
Hรบr.
A harmadik fรฉltล‘l szรกrmazรณ osztรกlyok pรฉldรกnyainak rendezรฉsรฉre van megvalรณsรญtva.
vรฉgrehajtja Minden burkolรณ osztรกly รฉs karakterlรกnc osztรกly hasonlรณ interfรฉszt valรณsรญt meg. A Comparator egyetlen megvalรณsรญtott osztรกlya a Collator รฉs a RuleBasedColator.

Bevรกlt gyakorlatok a Comparator รฉs Comparable in hasznรกlatรกhoz Java

  • Hasznรกljon รถsszehasonlรญthatรณ interfรฉszt, ha az รถsszehasonlรญtรกs szabvรกnyos az adott osztรกlyhoz.
  • Hasznรกlhat lambdรกkat komparรกtorral.
  • A rendelkezรฉsre รกllรณ alapvetล‘ osztรกlyok kรถzรผl sok hasonlรณ interfรฉszt valรณsรญt meg.
  • Lehetล‘sรฉg van a TreeSet รฉs a TreeMap hasznรกlatรกra a halmaz vagy a tรฉrkรฉp rendezรฉse kรถzben.
  • Az compareTo() mรณdszer komparรกtorral รฉs รถsszehasonlรญthatรณval is mลฑkรถdik.
  • Csak akkor hasznรกlja az รถsszehasonlรญtรณ felรผletet, ha < nagyobb rugalmassรกgra van szรผksรฉge.
  • Az compareTo() metรณdus pozitรญv egรฉsz szรกmot ad vissza, ha az elsล‘ objektum nagyobb, mint a mรกsik, negatรญvat, ha alacsonyabb, รฉs nullรกt, ha mindkettล‘ azonos.

Hogyan vรกlasszunk รถsszehasonlรญthatรณ รฉs รถsszehasonlรญtรณ elem kรถzรถtt

Gyakorlati tapasztalataim vรฉgรฉrvรฉnyesen azt sugalljรกk, hogy a Comparable รฉs a Comparator kiaknรกzรกsรกt Java jelentล‘sen megnรถveli az adatrendezรฉs feletti kontrollt, javรญtva a teljesรญtmรฉnyt รฉs a funkcionalitรกst egyarรกnt.

Foglald รถssze ezt a bejegyzรฉst a kรถvetkezล‘kรฉppen: