This shows you the differences between two versions of the page.
Both sides previous revision Previous revision Next revision | Previous revision Last revision Both sides next revision | ||
java:jfc_intf_sort [2015/03/23 05:06] gthanos [Υλοποιώντας το interface Comparable για δικούς μας τύπους δεδομένων] |
java:jfc_intf_sort [2016/02/26 11:15] 127.0.0.1 external edit |
||
---|---|---|---|
Line 53: | Line 53: | ||
<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// μας δίνει την δυνατότητα να αλλάξουμε την μέθοδο με την οποία συγκρίνονται τα αντικείμενα του συγκεκριμένου τύπου δεδομένων δίνοντας προτεραιότητα στο μικρό όνομα αντί για το επίθετο. | ||