This shows you the differences between two versions of the page.
| Both sides previous revision Previous revision Next revision | Previous revision Next revision Both sides next revision | ||
|
java:jfc_intf_sort [2015/03/23 05:11] gthanos |
java:jfc_intf_sort [2015/03/24 07:03] gthanos [Υλοποιώντας το interface Comparable για δικούς μας τύπους δεδομένων] |
||
|---|---|---|---|
| Line 53: | Line 53: | ||
| <WRAP 85% center round tip> | <WRAP 85% center round tip> | ||
| - | Εξ' ορισμού (εάν δεν την επαναπροσδιορίσετε) η μέθοδος [[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 των δύο αντικειμένων είναι ίδια__, δηλ. και οι δύο μεταβλητές δείχνουν στο ίδιο αντικείμενο. Στην πλειοψηφία των περιπτώσεων ο συγκεκριμένος τρόπος σύκρισης δεν μας δίνει στην πράξη ικανοποιητικό αποτελέσμα, καθώς αγνοεί αντικείμενα με τα ίδια περιεχόμενα. | + | Εξ' ορισμού (εάν δεν την επαναπροσδιορίσετε) η μέθοδος [[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 των δύο αντικειμένων είναι ίδια__, δηλ. και οι δύο μεταβλητές δείχνουν στο ίδιο αντικείμενο. Στην πλειοψηφία των περιπτώσεων ο συγκεκριμένος τρόπος σύκρισης δεν μας δίνει στην πράξη ικανοποιητικό αποτελέσμα, καθώς αγνοεί αντικείμενα με τα ίδια περιεχόμενα. |
| Σε αναλογία η μέθοδος [[https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html#hashCode--|hashCode]] επιστρέφει την δεκαεξαδική τιμή που δείχνει η μεταβλητή του αντικειμένου στην μνήμη. Με δεδομένο ότι __για δύο ίδια αντικείμενα τα hashCodes τους θα πρέπει να είναι κοινά__, η default υλοποίηση ταιριάζει με την default υλοποίηση της μεθόδου //equals//. Αν όμως αλλάξει η υλοποίηση της //equals// σε μία κλάση θα πρέπει να αλλάξει και η //hashCode()// ώστε δύο ίδια αντικείμενα κατά την μέθοδο //equals// να έχουν και ίδια hashCodes. | Σε αναλογία η μέθοδος [[https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html#hashCode--|hashCode]] επιστρέφει την δεκαεξαδική τιμή που δείχνει η μεταβλητή του αντικειμένου στην μνήμη. Με δεδομένο ότι __για δύο ίδια αντικείμενα τα hashCodes τους θα πρέπει να είναι κοινά__, η default υλοποίηση ταιριάζει με την default υλοποίηση της μεθόδου //equals//. Αν όμως αλλάξει η υλοποίηση της //equals// σε μία κλάση θα πρέπει να αλλάξει και η //hashCode()// ώστε δύο ίδια αντικείμενα κατά την μέθοδο //equals// να έχουν και ίδια hashCodes. | ||
| 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// μας δίνει την δυνατότητα να αλλάξουμε την μέθοδο με την οποία συγκρίνονται τα αντικείμενα του συγκεκριμένου τύπου δεδομένων δίνοντας προτεραιότητα στο μικρό όνομα αντί για το επίθετο. | ||