Both sides previous revisionPrevious revisionNext revision | Previous revision |
java:jfc_intf_sort [2020/03/12 16:51] – [Υλοποιώντας την ισότητα αντικειμένων τύπου Student] gthanos | java:jfc_intf_sort [Unknown date] (current) – external edit (Unknown date) 127.0.0.1 |
---|
| |
<code java Student.java> | <code java Student.java> |
public class Student implements java.lang.Comparable<Student> { | public class Student { |
private String firstName; | private String firstName; |
private String lastName; | private String lastName; |
| |
public boolean equals(Object o) { | public boolean equals(Object o) { |
| if(o == null) |
| return false; |
return (o instanceof Student && o.hashCode() == this.hashCode()); | return (o instanceof Student && o.hashCode() == this.hashCode()); |
} | } |
Παρατηρήστε ότι η μέθοδος equals επιστρέφει true εάν η παράμετρος ''Object ο'' είναι του τύπου της τρέχουσας κλάσης (δηλαδή Student) και έχει την ίδια τιμή hashCode με το τρέχον αντικείμενο. Αυτός είναι ένας τυπικός τρόπος για να ορίσετε τη συγκεκριμένη συνάρτηση. | Παρατηρήστε ότι η μέθοδος equals επιστρέφει true εάν η παράμετρος ''Object ο'' είναι του τύπου της τρέχουσας κλάσης (δηλαδή Student) και έχει την ίδια τιμή hashCode με το τρέχον αντικείμενο. Αυτός είναι ένας τυπικός τρόπος για να ορίσετε τη συγκεκριμένη συνάρτηση. |
| |
Η μέθοδος hashCode πρέπει να επιστρέφει την ίδια ακέραια τιμή για δύο ισα αντικείμενα. Για το συγκεκριμένο παράδειγμα είναι αναγκαίο να έχουμε υπόψη μας ότι η κλάση [[https://docs.oracle.com/javase/8/docs/api/java/lang/String.html|java.lang.String]] υλοποιεί τη συνάρτηση [[https://docs.oracle.com/javase/8/docs/api/java/lang/String.html#hashCode--|hashCode]] υπακούοντας στη συγκεκριμένη αρχή. Η υλοποίηση στη συνάρτηση Student αποκλείει να έχουμε δύο διαφορετικά αντικείμενα όπου το ένα είναι διαφορετικό από το άλλο αλλά έχουν το ίδιo hashCode(). | Η μέθοδος hashCode πρέπει να επιστρέφει την ίδια ακέραια τιμή για δύο ίσα αντικείμενα. Για το συγκεκριμένο παράδειγμα είναι αναγκαίο να έχουμε υπόψη μας ότι η κλάση [[https://docs.oracle.com/javase/8/docs/api/java/lang/String.html|java.lang.String]] υλοποιεί τη συνάρτηση [[https://docs.oracle.com/javase/8/docs/api/java/lang/String.html#hashCode--|hashCode]] υπακούοντας στη συγκεκριμένη αρχή. Η υλοποίηση στη συνάρτηση Student αποκλείει να έχουμε δύο διαφορετικά αντικείμενα όπου το ένα είναι διαφορετικό από το άλλο αλλά έχουν το ίδιo hashCode(). |
| |
===== Σύγκριση αντικειμένων ===== | ===== Σύγκριση αντικειμένων ===== |
| |
Εάν θέλουμε να αποθηκεύσουμε αντικείμενα σε μία δενδρική δομή λεξικού (π.χ. [[https://docs.oracle.com/javase/8/docs/api/java/util/TreeSet.html|java.util.TreeSet]] είναι αναγκαίο να ορίσουμε τον τροπο σύγκρισης των αντικειμένων μεταξύ τους. Η ίδια αναγκαιότητα προκύπτει έαν θέλουμε να ταξινομήσουμε ένα σύνολο στοιχείων ή να εφαρμόσουμε δυαδική αναζήτηση σε ένα ήδη ταξινομημένο σύνολο. | Εάν θέλουμε να αποθηκεύσουμε αντικείμενα σε μία δεντρική δομή λεξικού (π.χ. [[https://docs.oracle.com/javase/8/docs/api/java/util/TreeSet.html|java.util.TreeSet]] είναι αναγκαίο να ορίσουμε τον τρόπο σύγκρισης των αντικειμένων μεταξύ τους. Η ίδια ανάγκη προκύπτει έαν θέλουμε να ταξινομήσουμε ένα σύνολο στοιχείων ή να εφαρμόσουμε δυαδική αναζήτηση σε ένα ήδη ταξινομημένο σύνολο. |
| |
Η διαδικασία της σύγκρισης επιτυγχάνεται υλοποιώντας το interface [[http://docs.oracle.com/javase/7/docs/api/java/lang/Comparable.html|java.lang.Comparable]] (λεπτομέρειες [[java:comparable|εδώ]]), το οποίο ορίζει το κριτήριο σύγκρισης μεταξύ δύο αντικειμένων ιδίου τύπου. Οι κλάσεις της βασικής βιβλιοθήκης [[https://docs.oracle.com/javase/8/docs/api/java/lang/String.html|java.lang.String]], [[https://docs.oracle.com/javase/8/docs/api/java/util/Date.html|java.util.Date]] κ.α. υλοποιούν το συγκεκριμένο interface ορίζοντας τον κανόνα σύγκρισης μεταξύ δύο αντικειμένων. Παρακάτω δίνεται μία σειρά από δημοφιλείς κλάσεις της java και τα κριτήρια υλοποίησης του συγκεκριμένου interface για κάθε μία από αυτές. | Η διαδικασία της σύγκρισης επιτυγχάνεται υλοποιώντας το //interface// [[http://docs.oracle.com/javase/7/docs/api/java/lang/Comparable.html|java.lang.Comparable]] (λεπτομέρειες [[java:comparable|εδώ]]), το οποίο ορίζει το κριτήριο σύγκρισης μεταξύ δύο αντικειμένων ιδίου τύπου. Οι κλάσεις της βασικής βιβλιοθήκης [[https://docs.oracle.com/javase/8/docs/api/java/lang/String.html|java.lang.String]], [[https://docs.oracle.com/javase/8/docs/api/java/util/Date.html|java.util.Date]] κ.α. υλοποιούν το συγκεκριμένο interface ορίζοντας τον κανόνα σύγκρισης μεταξύ δύο αντικειμένων. Παρακάτω δίνεται μία σειρά από δημοφιλείς κλάσεις της java και τα κριτήρια υλοποίησης του συγκεκριμένου interface για κάθε μία από αυτές. |
| |
{{ :java:object-ordering.png?450 |}} | {{ :java:object-ordering.png?450 |}} |
==== Υλοποιώντας το interface Comparable για δικούς μας τύπους δεδομένων ==== | ==== Υλοποιώντας το interface Comparable για δικούς μας τύπους δεδομένων ==== |
| |
Παρακάτω δίνεται η υλοποίηση του interface [[https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html|java.lang.Comparable]] για την κλάση Student. | Παρακάτω δίνεται η υλοποίηση του interface [[https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html|java.lang.Comparable]] για την κλάση Student. Η υλοποίηση της μεθόδου compareTo συγκρίνει τα επίθετα των δύο φοιτητών. Εάν είναι διαφορετικά επιστρέφει τη λεξικογραφική διαφορά τους. Εάν είναι ίδια επιστρέφει τη λεξικογραφική διαφορά των ονομάτων τους. |
| |
<code java Student.java> | <code java Student.java> |
===== Συγκρίνοντας με χρήση ενός Comparator object ===== | ===== Συγκρίνοντας με χρήση ενός Comparator object ===== |
| |
[[:java:comparable#%CF%84%CE%BF_interface_javautilcomparator|Επαναλαμβάνοντας τη συλλογιστική]] για το interface [[https://docs.oracle.com/javase/8/docs/api/java/util/Comparator.html|java.util.Comparator]], ας υποθέσουμε ότι θέλουμε να συγκρίνουμε τα αντικείμενα τύπου Student με διαφορετική μέθοδο από την μέθοδο με την οποία συγκρίνονται ή ότι θέλουμε να συγκρίνουμε αντικείμενα τα οποία δεν υλοποιούν το interface //Comparable//. Σε αυτή την περίπτωση θα χρειαστούμε μία βοηθητική κλάση του τύπου [[http://docs.oracle.com/javase/7/docs/api/java/util/Comparator.html|java.util.Comparator]], όπως παρακάτω | [[:java:comparable#%CF%84%CE%BF_interface_javautilcomparator|Επαναλαμβάνοντας τη συλλογιστική]] για το interface [[https://docs.oracle.com/javase/8/docs/api/java/util/Comparator.html|java.util.Comparator]], ας υποθέσουμε ότι θέλουμε να συγκρίνουμε τα αντικείμενα τύπου Student με διαφορετική πολιτική από αυτή που είναι υλοποιημένη στη μέθοδο ''compareTo'' ή ότι θέλουμε να συγκρίνουμε αντικείμενα τα οποία δεν υλοποιούν το interface //Comparable//. Σε αυτή την περίπτωση θα χρειαστούμε μία βοηθητική κλάση του τύπου [[http://docs.oracle.com/javase/7/docs/api/java/util/Comparator.html|java.util.Comparator]]. Στο παρακάτω παράδειγμα, με τη βοήθεια της κλάσης StudentComparator γίνεται η σύγκριση αποκλειστικά με βάση το επίθετο και όχι με το συνδυασμό επίθετο και μικρό όνομα. |
| |
<code java StudentComparator.java> | <code java StudentComparator.java> |
</code> | </code> |
| |
|Προηγούμενο: [[:java:jfc_intf_map | Interface java.util.Map ]] | [[:toc | Περιεχόμενα ]] | Επόμενο: [[:java:jfc_intf_sorted_set_map | SortedSet και SortedMap ]] | | |Προηγούμενο: [[:java:jfc_interfaces | Interfaces ]] | [[:toc | Περιεχόμενα ]] | Επόμενο: [[:java:jfc_intf_collection | java.util.Collection ]] | |
| |