comparable comparator interfaces java
Denne tutorial forklarer begrebet Comparable And Comparator Interfaces In Java med eksempler. Du vil også lære om forskellene mellem de to:
Vi lærte alt om grænseflader i vores tidligere tutorials. En grænseflade bruges til at erklære abstrakte metoder og statiske eller endelige variabler. Som standard er grænseflademetoder offentlige. Siden Java 8 kan grænseflader også have statiske og standardmetoder defineret i dem.
Java leverer forskellige indbyggede grænseflader, som vi kan bruge til at udføre forskellige operationer. I denne vejledning vil vi diskutere to sådanne grænseflader, dvs. Comparable og Comparator. En sammenlignelig grænseflade bruges til at sortere objekt i henhold til den naturlige rækkefølge. Comparator interface bruges til at sortere individuelle attributter for forskellige objekter.
=> Udforsk Simple Java Training Series her.
Lad os begynde med en sammenlignelig grænseflade.
Hvad du vil lære:
- Sammenlignelig grænseflade i Java
- Comparator Interface i Java
- Forskellen mellem sammenlignelig vs komparator
- Konklusion
Sammenlignelig grænseflade i Java
Sammenlignelig grænseflade sorterer listestrukturer som Arrays og ArrayLists, der indeholder brugerdefinerede objekter. Når listeobjekterne implementerer Comparable interface, kan vi derefter bruge metoden Collections.sort () eller Arrays.sort () i tilfælde af arrays til at sortere indholdet.
Men når vi har brugerdefinerede klasser, og vi skal sortere deres objekter, bliver vi nødt til at implementere den sammenlignelige grænseflade i denne klasse. Den sammenlignelige grænseflade er en del af java.lang pakke. Denne grænseflade har kun en metode, CompareTo (). Ved hjælp af en sammenlignelig grænseflade kan vi sortere et enkelt datamedlem ad gangen.
For eksempel, hvis vi har navn og alder som felter i vores klasse, kan vi ad gangen enten sortere klasseobjekterne på navn eller alder. Vi kan ikke sortere samtidigt på både navn og alder.
Som forklaret ovenfor kan vi implementere den sammenlignelige grænseflade i Java ved at have en brugerdefineret klasse til at implementere den sammenlignelige grænseflade. Den sammenlignelige grænseflade har kun en metode 'CompareTo', som skal tilsidesættes i klassen for at sortere de brugerdefinerede objekter.
'CompareTo' metode
Metoden 'CompareTo' i den sammenlignelige grænseflade bruges til at sammenligne det aktuelle objekt med det givne objekt. Den generelle syntaks for comparTo-objektet er angivet nedenfor.
public int compareTo (Objekt obj)
Som vist ovenfor accepterer comparTo-metoden et objekt som et argument (det kan være ethvert brugerdefineret objekt) og sammenligner det med det aktuelle objekt, der bruges til at påkalde denne metode.
Metoden CompareTo returnerer et heltal, der kan have en af følgende værdier:
- Positivt (> 0) heltal => det aktuelle objekt> objektparameteren bestået.
- Negativ (det aktuelle objekt
- Nul (= 0) => det aktuelle objekt og det angivne objekt er begge ens.
Vi kan bruge metoden comparTo () til at sortere:
- Objekter af streng type
- Indpakningsklasseobjekter
- Brugerdefinerede eller brugerdefinerede objekter
Lad os nu implementere et eksempel på en sammenlignelig grænseflade.
Sammenligneligt grænsefladeeksempel
Følgende Java-program implementerer en Person-klasse, der indeholder navn og alder som medlemsfelter. Denne klasse implementerer en 'Sammenlignelig' grænseflade, der giver os mulighed for at sortere objektet til klasse Person.
Bemærk, at når vi skal sortere brugerdefinerede objekter, er vi nødt til at tilsidesætte 'sammenligne til ()' - metoden i den sammenlignelige grænseflade.
sorter kommando i linux med eksempler
Inde i metoden tilsidesat sammenligne () sammenligner vi alderen på det personobjekt, der sendes med det aktuelle objekt, og returnerer derfor værdien.
Nedenfor gives et eksempel på et Java-program.
//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 det ses af output, bruger vi en sammenlignelig grænseflade til at sammenligne to objekter i personklassen baseret på aldersmedlemvariablen.
Så som navnet antyder, giver en sammenlignelig grænseflade os mulighed for at sammenligne et objekt med det andet, forudsat at objekterne er af samme type. Så længe objekterne ved at arrangere sig selv, kan vi nemt sortere objekterne ved hjælp af den eneste metode 'CompareTo ()', der hører til denne grænseflade.
Java String CompareTo () -metode
Vi kan også bruge metoden comparTo () til at sammenligne to objekter af strengtypen i Java. De to strengobjekter sammenlignes leksikografisk ved at konvertere hvert tegn i strengobjektet til dets ækvivalente Unicode-tegn.
Hvis to strenge er ens, returneres 0. Hvis det første objekt er større end det andet objekt, returneres en positiv værdi, og en negativ værdi returneres, hvis det første strengobjekt er mindre end det andet strengobjekt.
For eksempel,
string1.compareTo (string2) sammenligner streng1 og streng 2 leksikografisk.
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 ovenstående program så vi, hvordan man bruger metoden comparTo () til at sammenligne to strenge. Før det brugte vi sammenligningsmetoden () til at sammenligne heltalsværdierne (f.eks. Alder). På samme måde kan vi bruge de andre datatyper som dobbelt med metoden comparTo ().
Lad os nu gå videre til Comparator-grænsefladen i Java.
Comparator Interface i Java
Vi har allerede set, hvordan den sammenlignelige grænseflade fungerer. Den sammenlignelige grænseflade giver os mulighed for at sortere brugerdefinerede objekter baseret på et enkelt datamedlem. Men når kravet opstår for at sortere objektet baseret på flere felter eller datamedlemmer, kan vi vælge en Comparator-grænseflade.
Ved hjælp af Comparator-grænsefladen kan vi oprette mere end en komparator afhængigt af hvor mange felter vi vil bruge til at sortere de brugerdefinerede objekter. Brug komparatorgrænsefladen, forudsat at vi vil sortere det brugerdefinerede objekt på to medlemsfelters navn og alder, så skal vi have to komparatorer, en for navn og en for alder.
Derefter kan vi kalde metoden Collections.sort () med disse komparatorer.
Så hvordan kan vi præcist skrive komparatorerne?
Overvej et eksempel på en klasselever med navn og alder som felt. Overvej, at vi vil sortere elevobjekter på felter med navn og alder.
Til dette formål bliver vi først nødt til at skrive Comparator-klasser, StudentAgeComparator og StudenNameComparator. I disse klasser tilsidesætter vi sammenligningsmetoden () i komparatorgrænsefladen, og derefter kalder vi metoden Collections.sort ved hjælp af hver af disse komparatorer til at sortere studenterobjekter.
Komparatorgrænsefladen indeholder et 'sammenligne'-objekt, der bruges til at sammenligne objekter i to forskellige klasser. Den generelle syntaks for sammenligningsmetoden er:
offentlig int sammenligne (Objekt obj1, Objekt obj2);
Sammenligningsmetoden sammenligner obj1 med obj2.
Comparator-grænsefladen er en del af java.util pakke og bortset fra sammenligningsmetoden; det indeholder også en anden metode, der hedder lig.
Java Comparator Eksempel
Lad os implementere et komparatoreksempel i Java. Igen har vi taget en studenterklasse med navn og alder som dets datamedlemmer. Derefter definerer vi en komparatorklasse AgeComparator, der tilsidesætter sammenligningsmetoden for at sammenligne alderen på to studerende og returnere passende værdier.
I hovedmetoden konstruerer vi en matrikeliste med studenterobjekter. Derefter kalder vi Collections.sort-metoden med ArrayList og AgeComparator-objekt som argumenter. Dette sorterer studentobjekterne efter alder.
Java-programmet, der implementerer dette scenarie, er angivet nedenfor.
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 ovenstående program, ligesom den måde, hvorpå vi har skrevet AgeComparator for at sortere Student-objekterne baseret på Age, kan vi også skrive en anden NameComparator for at sortere Student-objekterne baseret på navnefeltet.
På denne måde kan vi have så mange Comparator-klasser som nødvendigt for at sortere objekter i forskellige felter. Den måde, hvorpå vi sammenlignede to int-variabler, kan vi også sammenligne variabler fra de andre datatyper ved hjælp af sammenligningsmetoden.
Forskellen mellem sammenlignelig vs komparator
Sammenlignelig grænseflade | Komparatorgrænseflade |
---|---|
Bruger Collections.sort (List) til at sortere elementer. | Bruger Collections.sort (liste, komparator) til at sortere elementerne. |
Den sammenlignelige grænseflade giver sortering i enkelt felt. | Comparator interface giver flere feltsortering. |
Sammenlignelig grænseflade sorterer objekt i henhold til naturlig bestilling. | Comparator interface sorterer forskellige attributter for forskellige objekter. |
Ved hjælp af en sammenlignelig grænseflade kan vi sammenligne det aktuelle objekt 'dette' med det angivne objekt. | Ved hjælp af en komparatorgrænseflade kan vi sammenligne objekter fra forskellige klasser. |
En del af java.lang-pakken. | En del af java.util-pakken. |
Brugen af en sammenlignelig grænseflade ændrer den aktuelle klasse. | Komparator ændrer ikke den oprindelige klasse. |
Giver sammenligningsmetode () til sortering af elementer. | Giver sammenligningsmetode () til sortering af elementer. |
Ofte stillede spørgsmål
Q # 1) Er sammenlignelig en funktionel grænseflade?
Svar: Ja, sammenlignelig er en funktionel grænseflade. Det erklærer en enkelt abstrakt metode, sammenlignTo ().
Spørgsmål nr. 2) Hvordan laver du en klasse, der kan sammenlignes?
Svar: Vi laver en klasse sammenlignelig ved at implementere den sammenlignelige grænseflade. Inde i klassen tilsidesætter vi sammenligningsmetoden () for at sortere objektet. Vi passerer et objekt og sammenligner det med det aktuelle objekt.
Metoden comparTo () returnerer 0, hvis to objekter er ens. Det returnerer et negativt tal, hvis det første objekt er mindre end det andet og positivt, hvis det første objekt er større end det andet objekt.
Q # 3) Hvad er hovedformålet med Comparator-interface?
Svar: Comparator-interface bruges hovedsageligt til at sortere de brugerdefinerede objekter. En komparatorgrænseflade kan også bruges til at sammenligne objekter fra forskellige klasser. Komparatorgrænsefladen kan også bruges til at sortere objekter i flere felter.
Spørgsmål nr. 4) Hvorfor bruges Comparator i Java?
Svar: Komparatorgrænsefladen bruges hovedsageligt, når vi ønsker en anden sorteringsrækkefølge for vores brugerdefinerede objekter end naturlig ordning baseret på flere felter.
Spørgsmål nr. 5) Hvad implementerer den sammenlignelige grænseflade?
Svar: Sammenlignelig grænseflade implementeres af alle indpakningsklasser og strengklasser. Brugerdefinerede objekter bruger også den sammenlignelige grænseflade til sortering.
Konklusion
I denne vejledning har vi diskuteret sammenlignelige grænseflader og komparatorgrænseflader i Java. En sammenlignelig grænseflade bruges til at sortere objekterne pr. Naturlig rækkefølge og kan kun sortere objekterne på et felt ad gangen.
Den sammenlignelige grænseflade har en metode 'CompareTo ()', der skal tilsidesættes i klassen, der implementerer Comparator-grænsefladen, og hvis objekter skal sorteres.
Comparator-grænsefladen bruges til at sortere brugerdefinerede objekter, der skal sorteres baseret på en hvilken som helst anden rækkefølge. Sammenligningsgrænsefladen giver os også mulighed for at sortere objekter i to forskellige klasser baseret på flere felter.
=> Læs gennem Easy Java Training Series.
Anbefalet læsning
- Java-interface og abstrakt klasseundervisning med eksempler
- Indstil interface i Java: Java Set-tutorial med eksempler
- Java-implementering: Oprettelse og udførelse af Java JAR-fil
- Java Basics: Java Syntax, Java Class og Core Java Concepts
- Java Virtual Machine: Hvordan JVM hjælper med at køre Java-applikationer
- ListIterator-interface i Java med eksempler
- Objektarray i Java: Sådan oprettes, initialiseres og bruges
- JAVA-vejledning til begyndere: 100+ praktiske Java-videovejledninger