comparable comparator interfaces java
Denna handledning förklarar begreppet Comparable And Comparator Interfaces In Java med exempel. Du lär dig också om skillnaderna mellan de två:
Vi lärde oss allt om gränssnitt i våra tidigare handledning. Ett gränssnitt används för att deklarera abstrakta metoder och statiska eller slutliga variabler. Som standard är gränssnittsmetoder offentliga. Eftersom Java 8 kan gränssnitt också ha statiska metoder och standardmetoder definierade.
Java tillhandahåller olika inbyggda gränssnitt som vi kan använda för att utföra olika operationer. I den här handledningen kommer vi att diskutera två sådana gränssnitt, dvs Jämförbar och Jämförelse. Ett jämförbart gränssnitt används för att sortera objekt enligt den naturliga ordningen. Comparator-gränssnittet används för att sortera enskilda attribut för olika objekt.
=> Utforska The Simple Java Training Series här.
Låt oss börja med ett jämförbart gränssnitt.
Vad du kommer att lära dig:
- Jämförbart gränssnitt i Java
- Komparatorgränssnitt i Java
- Skillnaden mellan jämförbar vs komparator
- Slutsats
Jämförbart gränssnitt i Java
Jämförbart gränssnitt sorterar liststrukturer som Arrays och ArrayLists som innehåller anpassade objekt. När listobjekten har implementerat jämförbart gränssnitt kan vi sedan använda metoden Collections.sort () eller Arrays.sort () i fallet med arrays för att sortera innehållet.
Men när vi har anpassade klasser och vi behöver sortera deras objekt, måste vi implementera det jämförbara gränssnittet i den här klassen. Det jämförbara gränssnittet är en del av java.lang paket. Detta gränssnitt har bara en metod, CompareTo (). Med hjälp av ett jämförbart gränssnitt kan vi sortera en enda datamedlem åt gången.
Till exempel, om vi har namn och ålder som fält i vår klass kan vi åt gången antingen sortera klassobjekten på namn eller ålder. Vi kan inte sortera både på namn och ålder.
Som förklarats ovan kan vi implementera det jämförbara gränssnittet i Java genom att ha en anpassad klass för att implementera det jämförbara gränssnittet. Det jämförbara gränssnittet har bara en metod ”jämförTo” som måste åsidosättas i klassen för att sortera de anpassade objekten.
Metoden 'CompareTo'
Metoden ”jämför till” i det jämförbara gränssnittet används för att jämföra det aktuella objektet med det givna objektet. Den allmänna syntaxen för jämför-till-objektet ges nedan.
public int compareTo (Object obj)
Som visas ovan accepterar comparTo-metoden ett objekt som ett argument (det kan vara vilket som helst anpassat objekt) och jämför det med det aktuella objekt som används för att åberopa denna metod.
Metoden CompareTo returnerar ett heltal som kan ha ett av följande värden:
- Positivt (> 0) heltal => det aktuella objektet> objektparametern passerad.
- Negativt (det aktuella objektet
- Noll (= 0) => det aktuella objektet och det angivna objektet är båda lika.
Vi kan använda metoden comparTo () för att sortera:
- Objekt av strängtyp
- Förpackningsklassobjekt
- Användardefinierade eller anpassade objekt
Låt oss nu implementera ett exempel på ett jämförbart gränssnitt.
Jämförbart gränssnittsexempel
Följande Java-program implementerar en Person-klass som innehåller namn och ålder som medlemsfält. Den här klassen implementerar ett 'jämförbart' gränssnitt som gör att vi kan sortera objektet till klass Person.
Observera att när vi ska sortera anpassade objekt måste vi åsidosätta metoden 'jämförTill ()' i det jämförbara gränssnittet.
teststrategidokumentmall för smidig metodik
Inne i den åsidosatta jämförelsen () -metoden jämför vi åldern på personobjektet som skickas med det aktuella objektet och returnerar följaktligen värdet.
Ett exempel på Java-program ges nedan.
//class person implementing Comparable interface class Person implements Comparable { private String name; private int age; //Person constructor public Person(String name, int age) { this.name = name; this.age = age; } //getter methods for Person members public int getAge() { return this.age; } public String getName() { return this.name; } //override toString () method @Override public String toString() { return ''; } //Override compareTo () method to compare age of two Person objects @Override public int compareTo(Person per) { if(this.age == per.age) return 0; else return this.age > per.age ? 1 : -1; } } public class Main{ public static void main(String() args) { //declare two objects of Person class Person p1 = new Person('Adrian', 24); Person p2 = new Person('Eddie', 26); int ageDiff = p1.compareTo(p2); //compare ages of two persons declared switch(ageDiff) { case -1: { System.out.println(p2.getName() + ' is older than ' + p1.getName()); break; } case 1: { System.out.println(p1.getName() + ' is older than ' + p2.getName()); break; } default: System.out.println(p1.getName () + ' and ' + p2.getName () + ' are of the same age!'); } } }
Produktion:
Som framgår av utdata använder vi ett jämförbart gränssnitt för att jämföra två objekt i personklassen baserat på åldersmedelsvariabeln.
Så som namnet antyder tillåter ett jämförbart gränssnitt oss att jämföra ett objekt med det andra förutsatt att objekten är av samma typ. Så länge objekten vet att ordna sig själva kan vi enkelt sortera objekten med den enda metoden 'jämförTo ()' som hör till detta gränssnitt.
Java String CompareTo () -metod
Vi kan också använda metoden comparTo () för att jämföra två objekt av strängtyp i Java. De två strängobjekten jämförs lexikografiskt genom att konvertera varje tecken i strängobjektet till dess motsvarande Unicode-tecken.
Om två strängar är lika returneras 0. Om det första objektet är större än det andra objektet returneras ett positivt värde och ett negativt värde returneras om det första strängobjektet är mindre än det andra strängobjektet.
Till exempel,
string1.compareTo (string2) jämför sträng1 och sträng 2 lexikografiskt.
public class Main { public static void main(String args()) { //declare and print string objects String str1 = 'SoftwareTestingHelp'; String str2 = 'Java Series tutorial'; String str3 = 'Comparable Interface'; System.out.println('str1:' + str1); System.out.println('str2:' + str2); System.out.println('str3:' + str3); //compare strings and print the results. int retval1 = str1.compareTo( str2 ); System.out.println('
str1 & str2 comparison: '+retval1); int retval2 = str1.compareTo( str3 ); System.out.println('str1 & str3 comparison: '+retval2); int retval3 = str2.compareTo('compareTo method'); System.out.println('str2 & string argument comparison: '+retval3); } }
Produktion:
I programmet ovan såg vi hur man använder metoden CompareTo () för att jämföra två strängar. Innan dess använde vi metoden comparTo () för att jämföra heltalsvärdena (till exempel ålder). På samma sätt kan vi använda andra datatyper som dubbla med jämförelsemetoden ().
Nu går vi vidare till Comparator-gränssnittet i Java.
Komparatorgränssnitt i Java
Vi har redan sett hur det jämförbara gränssnittet fungerar. Det jämförbara gränssnittet tillåter oss att sortera anpassade objekt baserat på en enda datamedlem. Men när kravet uppstår att sortera objektet baserat på flera fält eller datamedlemmar kan vi välja ett Comparator-gränssnitt.
Med hjälp av Comparator-gränssnittet kan vi skapa mer än en komparator beroende på hur många fält vi vill använda för att sortera de anpassade objekten. Med hjälp av komparatorgränssnittet antar vi att vi vill sortera det anpassade objektet på två medlemsfält namn och ålder, då måste vi ha två komparatorer, en för namn och en för ålder.
Då kan vi ringa metoden Collections.sort () med dessa komparatorer.
Så hur exakt kan vi skriva komparatorerna?
Tänk på ett exempel på en klassstudent med namn och ålder som sitt fält. Tänk på att vi vill sortera studentobjekt på namn- och åldersfält.
För detta ändamål måste vi först skriva Comparator-klasser, StudentAgeComparator och StudenNameComparator. I dessa klasser kommer vi att åsidosätta jämförelsemetoden () i Comparator-gränssnittet, och sedan kommer vi att kalla metoden Collections.sort med var och en av dessa komparatorer för att sortera studentobjekt.
Komparatorgränssnittet innehåller ett ”jämför” -objekt som används för att jämföra objekt av två olika klasser. Den allmänna syntaxen för jämförelsemetoden är:
public int jämför (Objekt obj1, Objekt obj2);
Jämförelsemetoden jämför obj1 med obj2.
Comparator-gränssnittet är en del av java.util paket och bortsett från jämförelsemetoden; den innehåller också en annan metod som heter lika.
Java Comparator Exempel
Låt oss implementera ett jämförelseexempel i Java. Återigen har vi tagit en studentklass med namn och ålder som dess medlemmar. Sedan definierar vi en jämförelseklass AgeComparator som åsidosätter jämförelsemetoden för att jämföra åldrar på två elever och returnera lämpliga värden.
I huvudmetoden konstruerar vi en matrislista med studentobjekt. Sedan kallar vi Collections.sort-metoden med ArrayList och AgeComparator-objekt som argument. Detta sorterar studentobjekten efter ålder.
Java-programmet som implementerar detta scenario ges nedan.
import java.util.*; //class student whose objects are to be sorted class Student{ int rollno; String name; int age; Student(int rollno,String name,int age){ this.rollno=rollno; this.name=name; this.age=age; } } //AgeComparator class implementing Comparator to compare objects class AgeComparator implements Comparator { public int compare(Object o1,Object o2){ Student s1=(Student)o1; Student s2=(Student)o2; if(s1.age==s2.age) return 0; else if(s1.age>s2.age) return 1; else return -1; } } class Main{ public static void main(String args()){ //create an ArrayList of Students ArrayList myList=new ArrayList(); myList.add(new Student(101,'Adrian',25)); myList.add(new Student(106,'Sydney',22)); myList.add(new Student(105,'Marcus',27)); //call Collections.sort method with AgeComparator object to sort ArrayList Collections.sort(myList,new AgeComparator()); System.out.println('Sorted Student objects by Age are as follows:'); Iterator iter= myList.iterator(); while(iter.hasNext()){ Student st=(Student) iter.next(); System.out.println(st.rollno+' '+st.name+' '+st.age); } } }
Produktion:
I ovanstående program, liknar det sätt på vilket vi har skrivit AgeComparator för att sortera studentobjekten baserat på ålder, kan vi också skriva en annan NameComparator för att sortera studentobjekten baserat på namnfältet.
På så sätt kan vi ha så många Comparator-klasser som krävs för att sortera objekt i olika fält. Hur vi jämför två int-variabler kan vi också jämföra variabler för de andra datatyperna med jämförelsemetoden.
Skillnaden mellan jämförbar vs komparator
Jämförbart gränssnitt | Komparatorgränssnitt |
---|---|
Använder Collections.sort (List) för att sortera element. | Använder Collections.sort (List, Comparator) för att sortera elementen. |
Det jämförbara gränssnittet ger enstaka fältsortering. | Komparatorgränssnittet ger flera fält sortering. |
Jämförbart gränssnitt sorterar objekt enligt naturlig beställning. | Comparator-gränssnittet sorterar olika attribut för olika objekt. |
Med hjälp av ett jämförbart gränssnitt kan vi jämföra det aktuella objektet 'detta' med det angivna objektet. | Med hjälp av ett komparatorgränssnitt kan vi jämföra objekt av olika klasser. |
En del av paketet java.lang. | En del av paketet java.util. |
Användningen av ett jämförbart gränssnitt ändrar den faktiska klassen. | Comparator ändrar inte originalklassen. |
Ger jämförTo () -metoden för att sortera element. | Ger jämför () metod för att sortera element. |
Vanliga frågor
F # 1) Är ett funktionellt gränssnitt jämförbart?
Svar: Ja, jämförbart är ett funktionellt gränssnitt. Det förklarar en enda abstrakt metod, jämförTo ().
F # 2) Hur gör du en klass som är jämförbar?
Svar: Vi gör en klass jämförbar genom att implementera det jämförbara gränssnittet. Inuti klassen åsidosätter vi jämförelsemetoden () för att sortera objektet. Vi passerar ett objekt och jämför det med det aktuella objektet.
Metoden comparTo () returnerar 0 om två objekt är lika. Det returnerar ett negativt tal om det första objektet är mindre än det andra och positivt om det första objektet är större än det andra objektet.
F # 3) Vad är huvudsyftet med Comparator-gränssnittet?
Svar: Comparator-gränssnittet används främst för att sortera de anpassade objekten. Ett komparatorgränssnitt kan också användas för att jämföra objekt av olika klasser. Komparatorgränssnittet kan också användas för att sortera objekt i flera fält.
F # 4) Varför används Comparator i Java?
Svar: Comparator-gränssnittet används främst när vi vill ha en annan sorteringsordning för våra anpassade objekt än naturlig ordning baserat på flera fält.
F # 5) Vad implementerar det jämförbara gränssnittet?
Svar: Jämförbart gränssnitt implementeras av alla omslagsklasser och strängklasser. Anpassade objekt använder också det jämförbara gränssnittet för sortering.
Slutsats
I denna handledning har vi diskuterat jämförbara och jämförande gränssnitt i Java. Ett jämförbart gränssnitt används för att sortera objekten enligt naturlig ordning och kan samtidigt sortera objekten i ett fält.
Det jämförbara gränssnittet har en metod 'jämför till ()' som måste åsidosättas i klassen som implementerar komparatorgränssnittet och vars objekt ska sorteras.
Comparator-gränssnittet används för att sortera anpassade objekt som ska sorteras baserat på vilken annan ordning som helst. I komparatorgränssnittet kan vi också sortera objekt i två olika klasser baserat på flera fält.
=> Läs igenom Easy Java Training Series.
Rekommenderad läsning
- Java-gränssnitt och abstrakt klasshandledning med exempel
- Ställ in gränssnitt i Java: Java Set-handledning med exempel
- Java-distribution: Skapande och utförande av Java JAR-fil
- Java Basics: Java Syntax, Java Class och Core Java Concepts
- Java Virtual Machine: Hur JVM hjälper till att köra Java-applikationen
- ListIterator-gränssnitt i Java med exempel
- Objektuppsättning i Java: Hur man skapar, initierar och använder
- JAVA-handledning för nybörjare: 100+ praktiska Java-videohandledning