comparable comparator interfaces java
Αυτό το σεμινάριο εξηγεί την έννοια των συγκρίσιμων και συγκριτικών διεπαφών στην Java με παραδείγματα. Θα μάθετε επίσης για τις διαφορές μεταξύ των δύο:
Μάθαμε τα πάντα για τις διεπαφές στα προηγούμενα σεμινάρια μας. Μια διεπαφή χρησιμοποιείται για να δηλώσει αφηρημένες μεθόδους και στατικές ή τελικές μεταβλητές. Από προεπιλογή, οι μέθοδοι διεπαφής είναι δημόσιες. Από το Java 8, οι διεπαφές μπορούν επίσης να έχουν στατικές και προεπιλεγμένες μεθόδους.
Η Java παρέχει διάφορες ενσωματωμένες διεπαφές που μπορούμε να χρησιμοποιήσουμε για την εκτέλεση διαφόρων λειτουργιών. Σε αυτό το σεμινάριο, θα συζητήσουμε δύο τέτοιες διεπαφές, δηλαδή Συγκρίσιμες και Συγκριτικές. Μια συγκρίσιμη διεπαφή χρησιμοποιείται για την ταξινόμηση αντικειμένων σύμφωνα με τη φυσική σειρά. Η διεπαφή σύγκρισης χρησιμοποιείται για την ταξινόμηση μεμονωμένων χαρακτηριστικών διαφόρων αντικειμένων.
=> Εξερευνήστε την απλή σειρά εκπαίδευσης Java εδώ.
Ας ξεκινήσουμε με μια συγκρίσιμη διεπαφή.
Τι θα μάθετε:
- Συγκρίσιμη διεπαφή στην Java
- Διασύνδεση συγκριτή στην Java
- Διαφορά μεταξύ συγκρίσιμου Vs Comparator
- συμπέρασμα
Συγκρίσιμη διεπαφή στην Java
Η συγκρίσιμη διεπαφή ταξινομεί τις δομές λίστας, όπως Arrays και ArrayLists που περιέχουν προσαρμοσμένα αντικείμενα. Μόλις τα αντικείμενα της λίστας εφαρμόσουν τη συγκρίσιμη διεπαφή, μπορούμε στη συνέχεια να χρησιμοποιήσουμε τη μέθοδο Collections.sort () ή Arrays.sort () στην περίπτωση των πινάκων για να ταξινομήσουμε τα περιεχόμενα.
Αλλά όταν έχουμε προσαρμοσμένες τάξεις και πρέπει να ταξινομήσουμε τα αντικείμενά τους, τότε θα πρέπει να εφαρμόσουμε τη Συγκρίσιμη διεπαφή σε αυτήν την τάξη. Η συγκρίσιμη διεπαφή είναι μέρος του java.lang πακέτο. Αυτή η διεπαφή έχει μόνο μία μέθοδο, το σύγκρισηTo (). Χρησιμοποιώντας μια συγκρίσιμη διεπαφή, μπορούμε να ταξινομήσουμε ένα μεμονωμένο μέλος δεδομένων κάθε φορά.
Για παράδειγμα, αν έχουμε όνομα και ηλικία ως πεδία στην τάξη μας, τότε σε μια στιγμή μπορούμε είτε να ταξινομήσουμε τα αντικείμενα της τάξης στο όνομα ή την ηλικία. Δεν μπορούμε να ταξινομήσουμε ταυτόχρονα τόσο το όνομα όσο και την ηλικία.
Όπως εξηγήθηκε παραπάνω, μπορούμε να εφαρμόσουμε τη συγκρίσιμη διεπαφή στην Java, έχοντας μια προσαρμοσμένη κλάση για την εφαρμογή της συγκρίσιμης διεπαφής. Η συγκρίσιμη διεπαφή έχει μόνο μία μέθοδο «membandingkanTo» που πρέπει να παρακαμφθεί στην κλάση για να ταξινομήσετε τα προσαρμοσμένα αντικείμενα.
Μέθοδος «Συγκρίνετε»
Η μέθοδος «σύγκρισηTo» της συγκρίσιμης διεπαφής χρησιμοποιείται για τη σύγκριση του τρέχοντος αντικειμένου με το δεδομένο αντικείμενο. Η γενική σύνταξη του αντικειμένου σύγκρισης δίνεται παρακάτω.
public int membandingkanTo (Object obj)
Όπως φαίνεται παραπάνω, η μέθοδος σύγκρισης αποδέχεται ένα αντικείμενο ως όρισμα (μπορεί να είναι οποιοδήποτε προσαρμοσμένο αντικείμενο) και το συγκρίνει με το τρέχον αντικείμενο που χρησιμοποιείται για να επικαλεστεί αυτήν τη μέθοδο.
Η μέθοδος σύγκρισης επιστρέφει μια ακέραια τιμή που μπορεί να έχει μία από τις ακόλουθες τιμές:
- Θετικός (> 0) ακέραιος => το τρέχον αντικείμενο> η παράμετρος αντικειμένου πέρασε.
- Αρνητικό (το τρέχον αντικείμενο
- Μηδέν (= 0) => το τρέχον αντικείμενο και το καθορισμένο αντικείμενο είναι και τα δύο ίδια.
Μπορούμε να χρησιμοποιήσουμε τη μέθοδο σύγκρισης () για να ταξινομήσουμε:
- Αντικείμενα τύπου συμβολοσειράς
- Αντικείμενα κλάσης περιτυλίγματος
- Ορισμένα από τον χρήστη ή προσαρμοσμένα αντικείμενα
Τώρα ας εφαρμόσουμε ένα παράδειγμα συγκρίσιμης διεπαφής.
Παράδειγμα συγκρίσιμης διεπαφής
Το ακόλουθο πρόγραμμα Java εφαρμόζει μια κλάση προσώπων που περιέχει όνομα και ηλικία ως πεδία μέλους. Αυτή η τάξη εφαρμόζει μια «Συγκρίσιμη» διεπαφή που θα μας επιτρέψει να ταξινομήσουμε το αντικείμενο του Class Person.
Σημειώστε ότι καθώς πρόκειται να ταξινομήσουμε προσαρμοσμένα αντικείμενα, πρέπει να παρακάμψουμε τη μέθοδο «membandingkanTo ()» της συγκρίσιμης διεπαφής.
δηλώστε έναν πίνακα συμβολοσειρών σε java
Μέσα στη μέθοδο παράκαμψης σύγκρισηTo (), συγκρίνουμε την ηλικία του αντικειμένου ατόμου που περνά με αυτήν του τρέχοντος αντικειμένου και, συνεπώς, επιστρέφουμε την τιμή.
Ένα παράδειγμα προγράμματος Java δίνεται παρακάτω.
//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!'); } } }
Παραγωγή:
Όπως φαίνεται από την έξοδο, χρησιμοποιούμε μια συγκρίσιμη διεπαφή για να συγκρίνουμε δύο αντικείμενα της κατηγορίας Person βάσει της μεταβλητής ηλικιακού μέλους.
Έτσι, όπως υποδηλώνει το όνομα, μια συγκρίσιμη διεπαφή μας επιτρέπει να συγκρίνουμε ένα αντικείμενο με το άλλο υπό την προϋπόθεση ότι τα αντικείμενα είναι του ίδιου τύπου. Εφόσον τα αντικείμενα γνωρίζουν να τακτοποιούνται, μπορούμε να ταξινομήσουμε τα αντικείμενα εύκολα χρησιμοποιώντας τη μοναδική μέθοδο «membandingkanTo ()» που ανήκει σε αυτήν τη διεπαφή.
Μέθοδος Java String σύγκρισηTo ()
Μπορούμε επίσης να χρησιμοποιήσουμε τη μέθοδο σύγκρισης () για να συγκρίνουμε δύο αντικείμενα τύπου συμβολοσειράς στην Java. Τα δύο αντικείμενα συμβολοσειράς συγκρίνονται λεξικογραφικά μετατρέποντας κάθε χαρακτήρα του αντικειμένου συμβολοσειράς σε ισοδύναμο χαρακτήρα του Unicode.
Εάν δύο συμβολοσειρές είναι ίσες, τότε το 0 επιστρέφεται. Εάν το πρώτο αντικείμενο είναι μεγαλύτερο από το δεύτερο αντικείμενο, τότε μια θετική τιμή επιστρέφεται και μια αρνητική τιμή επιστρέφεται εάν το πρώτο αντικείμενο συμβολοσειράς είναι μικρότερο από το δεύτερο αντικείμενο συμβολοσειράς.
Για παράδειγμα,
Το string1.compareTo (string2) θα συγκρίνει το string1 και το string 2 λεξικογραφικά.
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); } }
Παραγωγή:
Στο παραπάνω πρόγραμμα, είδαμε πώς να χρησιμοποιήσουμε τη μέθοδο σύγκρισης () για να συγκρίνουμε δύο χορδές. Πριν από αυτό, χρησιμοποιήσαμε τη μέθοδο σύγκρισηςTo () για να συγκρίνουμε τις ακέραιες τιμές (για παράδειγμα ηλικία). Παρομοίως, μπορούμε να χρησιμοποιήσουμε τους άλλους τύπους δεδομένων όπως τα διπλά με τη μέθοδο σύγκρισης ().
Τώρα ας προχωρήσουμε στη διεπαφή σύγκρισης στην Java.
Διασύνδεση συγκριτή στην Java
Έχουμε ήδη δει τη λειτουργία της συγκρίσιμης διεπαφής. Η συγκρίσιμη διεπαφή μας επιτρέπει να ταξινομήσουμε προσαρμοσμένα αντικείμενα με βάση ένα μόνο μέλος δεδομένων. Αλλά όταν προκύψει η απαίτηση για ταξινόμηση του αντικειμένου με βάση πολλά πεδία ή μέλη δεδομένων, τότε μπορούμε να επιλέξουμε μια διεπαφή σύγκρισης.
Χρησιμοποιώντας τη διεπαφή Συγκριτή, μπορούμε να δημιουργήσουμε περισσότερους από έναν συγκριτές ανάλογα με το πόσα πεδία θέλουμε να χρησιμοποιήσουμε για να ταξινομήσουμε τα προσαρμοσμένα αντικείμενα. Χρησιμοποιώντας τη διεπαφή σύγκρισης, υποθέτοντας ότι θέλουμε να ταξινομήσουμε το προσαρμοσμένο αντικείμενο σε δύο πεδία όνομα και ηλικία, τότε πρέπει να έχουμε δύο συγκριτές, έναν για όνομα και έναν για ηλικία.
Στη συνέχεια, μπορούμε να καλέσουμε τη μέθοδο Collections.sort () με αυτούς τους Συγκριτές.
Λοιπόν, πώς ακριβώς μπορούμε να γράψουμε τους Συγκριτές;
Σκεφτείτε ένα παράδειγμα μαθητή τάξης με όνομα και ηλικία ως πεδίο. Σκεφτείτε ότι θέλουμε να ταξινομήσουμε αντικείμενα μαθητή σε πεδία ονόματος και ηλικίας.
Για το σκοπό αυτό, θα πρέπει πρώτα να γράψουμε μαθήματα Συγκριτών, StudentAgeComparator και StudenNameComparator. Σε αυτές τις τάξεις, θα παρακάμψουμε τη μέθοδο σύγκρισης () της διεπαφής σύγκρισης και, στη συνέχεια, θα καλέσουμε τη μέθοδο Collections.sort χρησιμοποιώντας κάθε έναν από αυτούς τους συγκριτές για να ταξινομήσουμε αντικείμενα μαθητή.
Η διεπαφή σύγκρισης περιέχει ένα αντικείμενο «σύγκρισης» που χρησιμοποιείται για τη σύγκριση αντικειμένων δύο διαφορετικών κλάσεων. Η γενική σύνταξη της μεθόδου σύγκρισης είναι:
public int σύγκριση (Object obj1, Object obj2);
Η μέθοδος σύγκρισης συγκρίνει το obj1 με το obj2.
Η διεπαφή σύγκρισης είναι ένα μέρος του java.util πακέτο και εκτός από τη μέθοδο σύγκρισης. περιέχει επίσης μια άλλη μέθοδο που ονομάζεται ίση.
Παράδειγμα σύγκρισης Java
Ας εφαρμόσουμε ένα παράδειγμα σύγκρισης στην Java. Και πάλι, έχουμε πάρει μια τάξη μαθητών με όνομα και ηλικία ως μέλη δεδομένων της. Στη συνέχεια, ορίζουμε μια κατηγορία σύγκρισης AgeComparator που παρακάμπτει τη μέθοδο σύγκρισης για τη σύγκριση ηλικιών δύο μαθητών και επιστρέφει τις κατάλληλες τιμές.
Στην κύρια μέθοδο, κατασκευάζουμε μια λίστα με αντικείμενα μαθητών. Στη συνέχεια, καλούμε τη μέθοδο Collections.sort με αντικείμενο ArrayList και AgeComparator ως ορίσματα. Αυτό ταξινομεί τα αντικείμενα μαθητή ανάλογα με την ηλικία.
Το πρόγραμμα Java που εφαρμόζει αυτό το σενάριο δίνεται παρακάτω.
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); } } }
Παραγωγή:
Στο παραπάνω πρόγραμμα, παρόμοιο με τον τρόπο με τον οποίο γράψαμε το AgeComparator για να ταξινομήσουμε τα αντικείμενα Student βάσει του Age, μπορούμε επίσης να γράψουμε ένα άλλο NameComparator για να ταξινομήσουμε τα αντικείμενα Student βάσει του πεδίου ονόματος.
Με αυτόν τον τρόπο μπορούμε να έχουμε όσες κατηγορίες Συγκριτών απαιτούνται για την ταξινόμηση αντικειμένων σε διάφορα πεδία. Ο τρόπος με τον οποίο συγκρίναμε δύο μεταβλητές int, μπορούμε επίσης να συγκρίνουμε μεταβλητές των άλλων τύπων δεδομένων χρησιμοποιώντας τη μέθοδο σύγκρισης.
Διαφορά μεταξύ συγκρίσιμου Vs Comparator
Συγκρίσιμη διεπαφή | Διεπαφή σύγκρισης |
---|---|
Χρησιμοποιεί το Collections.sort (List) για ταξινόμηση στοιχείων. | Χρησιμοποιεί το Collections.sort (List, Comparator) για να ταξινομήσετε τα στοιχεία. |
Η συγκρίσιμη διεπαφή παρέχει διαλογή ενός πεδίου. | Η διεπαφή σύγκρισης παρέχει ταξινόμηση πολλαπλών πεδίων. |
Η συγκρίσιμη διεπαφή ταξινομεί το αντικείμενο σύμφωνα με τη φυσική σειρά. | Η διεπαφή σύγκρισης ταξινομεί διάφορα χαρακτηριστικά διαφορετικών αντικειμένων. |
Χρησιμοποιώντας μια συγκρίσιμη διεπαφή μπορούμε να συγκρίνουμε το τρέχον αντικείμενο «αυτό» με το καθορισμένο αντικείμενο. | Χρησιμοποιώντας μια διεπαφή σύγκρισης, μπορούμε να συγκρίνουμε αντικείμενα διαφορετικών κατηγοριών. |
Μέρος του πακέτου java.lang. | Μέρος του πακέτου java.util. |
Η χρήση μιας συγκρίσιμης διεπαφής τροποποιεί την πραγματική κλάση. | Το Συγκριτικό δεν αλλάζει την αρχική τάξη. |
Παρέχει τη μέθοδο σύγκρισηςTo () για ταξινόμηση στοιχείων. | Παρέχει μέθοδο σύγκρισης () για ταξινόμηση στοιχείων. |
Συχνές Ερωτήσεις
Ε # 1) Είναι συγκρίσιμη μια λειτουργική διεπαφή;
Απάντηση: Ναι, συγκρίσιμο είναι μια λειτουργική διεπαφή. Δηλώνει μια μεμονωμένη αφηρημένη μέθοδο, membandingkanTo ().
Q # 2) Πώς κάνετε μια κατηγορία συγκρίσιμη;
Απάντηση: Κάνουμε μια κατηγορία συγκρίσιμη με την εφαρμογή της Συγκρίσιμης διεπαφής. Μέσα στην τάξη, παρακάμπτουμε τη μέθοδο σύγκρισης () για να ταξινομήσουμε το αντικείμενο. Περνάμε ένα αντικείμενο και το συγκρίνουμε με το τρέχον αντικείμενο.
Η μέθοδος membandingkanTo () επιστρέφει 0 εάν δύο αντικείμενα είναι ίδια. Επιστρέφει έναν αρνητικό αριθμό εάν το πρώτο αντικείμενο είναι μικρότερο από το δεύτερο και θετικό εάν το πρώτο αντικείμενο είναι μεγαλύτερο από το δεύτερο αντικείμενο.
Q # 3) Ποιος είναι ο κύριος σκοπός της διεπαφής σύγκρισης;
Απάντηση: Η διεπαφή σύγκρισης χρησιμοποιείται κυρίως για την ταξινόμηση των προσαρμοσμένων αντικειμένων. Μια διεπαφή σύγκρισης μπορεί επίσης να χρησιμοποιηθεί για σύγκριση αντικειμένων διαφορετικών τάξεων. Επίσης, η διεπαφή σύγκρισης μπορεί να χρησιμοποιηθεί για την ταξινόμηση αντικειμένων σε πολλά πεδία.
Q # 4) Γιατί χρησιμοποιείται το Comparator στην Java;
Απάντηση: Η διεπαφή σύγκρισης χρησιμοποιείται κυρίως όταν θέλουμε μια διαφορετική σειρά ταξινόμησης για τα προσαρμοσμένα αντικείμενα μας εκτός από τη φυσική παραγγελία βάσει πολλαπλών πεδίων.
Q # 5) Τι εφαρμόζει η συγκρίσιμη διεπαφή;
Απάντηση: Η συγκρίσιμη διεπαφή εφαρμόζεται από όλες τις τάξεις περιτυλίγματος και την κατηγορία String. Τα προσαρμοσμένα αντικείμενα χρησιμοποιούν επίσης τη συγκρίσιμη διεπαφή για ταξινόμηση.
συμπέρασμα
Σε αυτό το σεμινάριο, έχουμε συζητήσει συγκρίσιμες και συγκριτικές διεπαφές στην Java. Μια συγκρίσιμη διεπαφή χρησιμοποιείται για να ταξινομήσετε τα αντικείμενα σύμφωνα με τη φυσική σειρά και κάθε φορά να ταξινομήσετε τα αντικείμενα μόνο σε ένα πεδίο.
Η συγκρίσιμη διεπαφή έχει μια μέθοδο «membandingkanTo ()» που πρέπει να παρακαμφθεί στην κλάση που εφαρμόζει τη διεπαφή σύγκρισης και των οποίων τα αντικείμενα πρέπει να ταξινομηθούν.
Η διεπαφή σύγκρισης χρησιμοποιείται για την ταξινόμηση προσαρμοσμένων αντικειμένων που πρόκειται να ταξινομηθούν με βάση οποιαδήποτε άλλη σειρά. Η διεπαφή σύγκρισης μας επιτρέπει επίσης να ταξινομήσουμε αντικείμενα δύο διαφορετικών κατηγοριών με βάση πολλά πεδία.
=> Διαβάστε ολόκληρη τη σειρά Easy Java Training.
Συνιστώμενη ανάγνωση
- Java Interface και Abstract Class Tutorial με παραδείγματα
- Ορισμός διεπαφής σε Java: Java Set Tutorial με παραδείγματα
- Ανάπτυξη Java: Δημιουργία και εκτέλεση αρχείου Java JAR
- Βασικά Java: Java Syntax, Java Class και Core Java Concepts
- Java Virtual Machine: Πώς βοηθά το JVM στην εκτέλεση της εφαρμογής Java
- Διασύνδεση ListIterator σε Java με παραδείγματα
- Σειρά αντικειμένων σε Java: Πώς να δημιουργήσετε, να αρχικοποιήσετε και να χρησιμοποιήσετε
- Εκπαιδευτικό πρόγραμμα JAVA για αρχάριους: 100+ πρακτικά εκπαιδευτικά βίντεο Java