java:jfc_intf_sort

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
java:jfc_intf_sort [2015/03/23 05:06]
gthanos [Υλοποιώντας το interface Comparable για δικούς μας τύπους δεδομένων]
java:jfc_intf_sort [2017/05/12 12:18] (current)
gthanos [Υλοποιώντας το interface Comparable για δικούς μας τύπους δεδομένων]
Line 48: Line 48:
 Τα βασικά χαρακτηριστικά της παραπάνω κλάσης είναι τα εξής: Τα βασικά χαρακτηριστικά της παραπάνω κλάσης είναι τα εξής:
   * Έλεγχος στον κατασκευαστή εάν περνάνε ή όχι null ορίσματα. Αυτό μας προστατεύει από το να έρθουμε αντιμέτωποι με //​NullPointerException//​ στην συνέχεια.   * Έλεγχος στον κατασκευαστή εάν περνάνε ή όχι null ορίσματα. Αυτό μας προστατεύει από το να έρθουμε αντιμέτωποι με //​NullPointerException//​ στην συνέχεια.
-  * Η μέθοδος //equal()// επαναπροσδιορίζεται,​ έτσι ώστε να συγκρίνονται τα πεδία της κλάσης Name μεταξύ τους.+  * Η μέθοδος //equals()// επαναπροσδιορίζεται,​ έτσι ώστε να συγκρίνονται τα πεδία της κλάσης Name μεταξύ τους.
   * Η μέθοδος //​hashCode()//​ επαναπροσδιορίζεται. Ο λόγος που πρέπει να επαναπροσδιορίσουμε την μέθοδο αυτή είναι ότι εξ' ορισμού δύο ίδια αντικείμενα θα πρέπει να έχουν και ίδια //​hashCodes//​. Εφόσον άλλαξε η μέθοδος //equal()// θα αλλάξει και η μέθοδος //​hashCode()//​ ώστε να επιστρέφει το ίδιο hash για αντικείμενα που η equals επιστρέφει ισότητα.   * Η μέθοδος //​hashCode()//​ επαναπροσδιορίζεται. Ο λόγος που πρέπει να επαναπροσδιορίσουμε την μέθοδο αυτή είναι ότι εξ' ορισμού δύο ίδια αντικείμενα θα πρέπει να έχουν και ίδια //​hashCodes//​. Εφόσον άλλαξε η μέθοδος //equal()// θα αλλάξει και η μέθοδος //​hashCode()//​ ώστε να επιστρέφει το ίδιο hash για αντικείμενα που η equals επιστρέφει ισότητα.
   * Υλοποιείται η μέθοδος //int comparTo(T t)//.   * Υλοποιείται η μέθοδος //int comparTo(T t)//.
  
 <WRAP 85% center round tip> <WRAP 85% center round tip>
-Εξ' ορισμού (εάν δεν την επαναπροσδιορίσετε) η μέθοδος [[http://​docs.oracle.com/​javase/​tutorial/​java/​IandI/​objectclass.html|equals ​συγκρίνει δύο αντικείμενα]] με βάση την διεύθυνση ​στην οποία δίχνει η μεταβλητή ​του κάθε αντικειμένου. Στην πραγματικότητα επιστρέφει ισότητα __μόνο αν τα references των δύο αντικειμένων είναι ίδια__, δηλ. και οι δύο μεταβλητές δείχνουν στο ίδιο αντικείμενο. Στην πλειοψηφία των περιπτώσεων ο συγκεκριμένος τρόπος σύκρισης δεν μας δίνει στην πράξη ικανοποιητικό αποτελέσμα.+Εξ' ορισμού (εάν δεν την επαναπροσδιορίσετε) η μέθοδος ​[[https://​docs.oracle.com/​javase/​8/​docs/​api/​java/​lang/​Object.html#​equals-java.lang.Object-|equals]], ​[[http://​docs.oracle.com/​javase/​tutorial/​java/​IandI/​objectclass.html|συγκρίνει δύο αντικείμενα με βάση την διεύθυνση του κάθε αντικειμένου]]. Στην πραγματικότητα επιστρέφει ισότητα __μόνο αν τα references των δύο αντικειμένων είναι ίδια__, δηλ. και οι δύο μεταβλητές δείχνουν στο ίδιο αντικείμενο. Στην πλειοψηφία των περιπτώσεων ο συγκεκριμένος τρόπος σύκρισης δεν μας δίνει στην πράξη ικανοποιητικό αποτελέσμα, καθώς αγνοεί αντικείμενα με τα ίδια περιεχόμενα.
  
-Σε αναλογία η μέθοδος //hashCode// επιστρέφει την δεκαεξαδική τιμή που δείχνει η μεταβλητή του αντικειμένου στην μνήμη. Με δεδομένο ότι για δύο ίδια αντικείμενα τα hashCodes τους θα πρέπει να είναι κοινά, η default υλοποίηση ταιριάζει με την default υλοποίηση της μεθόδο //equal//. Αν όμως αλλάξει η //equal// θα πρέπει να αλλάξει και η //​hashCode()//​ ώστε δύο ίδια αντικείμενα κατά την //equal// να έχουν και ίδια ​hashCode.+Σε αναλογία η μέθοδος ​[[https://docs.oracle.com/javase/8/​docs/​api/​java/​lang/​Object.html#​hashCode--|hashCode]] ​επιστρέφει την δεκαεξαδική τιμή που δείχνει η μεταβλητή του αντικειμένου στην μνήμη. Με δεδομένο ότι ​__για δύο ίδια αντικείμενα τα hashCodes τους θα πρέπει να είναι κοινά__, η default υλοποίηση ταιριάζει με την default υλοποίηση της μεθόδου //equals//. Αν όμως αλλάξει η υλοποίηση της ​//equals// σε μία κλάση ​θα πρέπει να αλλάξει και η //​hashCode()//​ ώστε δύο ίδια αντικείμενα κατά την ​μέθοδο ​//equals// να έχουν και ίδια ​hashCodes.
 </​WRAP>​ </​WRAP>​
  
Line 76: Line 76:
 } }
 </​code>​ </​code>​
 +
 +===== Συγκρίνοντας με χρήσης ενός Comparator object =====
 +
 +Ας υποθέσουμε ότι θέλουμε να συγκρίνουμε αντικείμενα με διαφορετική μέθοδο από την μέθοδο με την οποία συγκρίνονται ή ότι θέλουμε να συγκρίνουμε αντικείμενα τα οποία δεν υλοποιούν το interface //​Comparable//​. Σε αυτή την περίπτωση θα χρειαστείουμε ένα βοηθητικό αντικείμενο του τύπου [[http://​docs.oracle.com/​javase/​7/​docs/​api/​java/​util/​Comparator.html|Comparator]],​ όπως παρακάτω
  
 <code java NameComparatorSort.java>​ <code java NameComparatorSort.java>​
Line 101: Line 105:
 } }
 </​code>​ </​code>​
 +
 +Ο συγκεκριμένος //​Comparator//​ μας δίνει την δυνατότητα να αλλάξουμε την μέθοδο με την οποία συγκρίνονται τα αντικείμενα του συγκεκριμένου τύπου δεδομένων δίνοντας προτεραιότητα στο μικρό όνομα αντί για το επίθετο.
  
java/jfc_intf_sort.1427087175.txt.gz · Last modified: 2016/02/26 11:15 (external edit)