This shows you the differences between two versions of the page.
| Both sides previous revision Previous revision Next revision | Previous revision | ||
|
java:jfc_intf_sort [2020/03/12 16:24] gthanos [Υλοποιώντας την ισότητα αντικειμένων τύπου Student] |
java:jfc_intf_sort [2021/04/05 06:13] |
||
|---|---|---|---|
| Line 1: | Line 1: | ||
| - | ====== Ανίχνευση ισότητας και σύγκριση αντικειμένων ====== | ||
| - | |||
| - | ===== Ανίχνευση ισότητας αντικειμένων ===== | ||
| - | |||
| - | Εάν θέλουμε να αποθηκεύσουμε σε ένα //hash table// μία σειρά αντικειμένων θα πρέπει να είμαστε σίγουροι ότι δεν θα προστεθούν σε αυτό δύο ίδια αντικείμενα. Κατά συνέπεια, | ||
| - | |||
| - | Προκειμένου να μπορούμε να ανιχνεύουμε την ισότητα μεταξύ αντικειμένων η Java παρέχει τις μεθόδους [[https:// | ||
| - | |||
| - | ==== Υλοποιώντας την ισότητα αντικειμένων τύπου Student ==== | ||
| - | |||
| - | Παρακάτω δίνεται η κλάση Student ενημερωμένη ώστε να περιέχει τις υλοποιήσεις των συναρτήσεων [[https:// | ||
| - | |||
| - | <code java Student.java> | ||
| - | public class Student implements java.lang.Comparable< | ||
| - | private String firstName; | ||
| - | private String lastName; | ||
| - | | ||
| - | public Student(String fname, String lname) { | ||
| - | firstName = fname; | ||
| - | lastName = lname; | ||
| - | } | ||
| - | | ||
| - | public void setFirstName( String firstName ) { | ||
| - | this.firstName = firstName; | ||
| - | } | ||
| - | | ||
| - | public void setLastName( String lastName ) { | ||
| - | this.lastName = lastName; | ||
| - | } | ||
| - | | ||
| - | public String getFirstName() { | ||
| - | return firstName; | ||
| - | } | ||
| - | | ||
| - | public String getLastName() { | ||
| - | return lastName; | ||
| - | } | ||
| - | |||
| - | public String toString() { | ||
| - | return firstName+" | ||
| - | } | ||
| - | | ||
| - | public boolean equals(Object o) { | ||
| - | return (o instanceof Student && o.hashCode() == this.hashCode()); | ||
| - | } | ||
| - | | ||
| - | public int hashCode() { | ||
| - | return 3 * firstName.hashCode() + 5 * lastName.hashCode(); | ||
| - | } | ||
| - | } | ||
| - | </ | ||
| - | |||
| - | Παρατηρήστε ότι η μέθοδος equals επιστρέφει true εάν η παράμετρος '' | ||
| - | |||
| - | Η μέθοδος hashCode πρέπει να επιστρέφει την ίδια ακέραια τιμή για δύο ισα αντικείμενα. Για το συγκεκριμένο παράδειγμα είναι αναγκαίο να έχουμε υπόψη μας ότι η κλάση [[java.lang.String]] υλοποιεί τη συνάρτηση hashCode υπακούοντας στη συγκεκριμένη αρχή. Η παραπάνω υλοποίηση αποκλείει να έχουμε δύο διαφορετικά αντικείμενα όπου το ένα είναι διαφορετικό από το άλλο αλλά έχουν το ίδιo hashCode(). | ||
| - | |||
| - | ===== Σύγκριση αντικειμένων ===== | ||
| - | |||
| - | Εάν θέλουμε να αποθηκεύσουμε αντικείμενα σε μία δενδρική δομή λεξικού (π.χ. [[https:// | ||
| - | |||
| - | Η διαδικασία της σύγκρισης επιτυγχάνεται υλοποιώντας το interface [[http:// | ||
| - | |||
| - | {{ : | ||
| - | |||
| - | ==== Υλοποιώντας το interface Comparable για δικούς μας τύπους δεδομένων ==== | ||
| - | |||
| - | Παρακάτω δίνεται η υλοποίηση του interface [[https:// | ||
| - | |||
| - | <code java Student.java> | ||
| - | public class Student implements java.lang.Comparable< | ||
| - | private String firstName; | ||
| - | private String lastName; | ||
| - | | ||
| - | public Student(String fname, String lname) { | ||
| - | firstName = fname; | ||
| - | lastName = lname; | ||
| - | } | ||
| - | | ||
| - | public void setFirstName( String firstName ) { | ||
| - | this.firstName = firstName; | ||
| - | } | ||
| - | | ||
| - | public void setLastName( String lastName ) { | ||
| - | this.lastName = lastName; | ||
| - | } | ||
| - | | ||
| - | public String getFirstName() { | ||
| - | return firstName; | ||
| - | } | ||
| - | | ||
| - | public String getLastName() { | ||
| - | return lastName; | ||
| - | } | ||
| - | |||
| - | public String toString() { | ||
| - | return firstName+" | ||
| - | } | ||
| - | | ||
| - | public boolean equals(Object o) { | ||
| - | return (o instanceof Student && o.hashCode() == this.hashCode()); | ||
| - | } | ||
| - | | ||
| - | public int hashCode() { | ||
| - | return 3 * firstName.hashCode() + 5 * lastName.hashCode(); | ||
| - | } | ||
| - | | ||
| - | public int compareTo(Student st) { | ||
| - | return lastName.compareTo(st.lastName) != 0 ? lastName.compareTo(st.lastName) : firstName.compareTo(st.firstName); | ||
| - | } | ||
| - | } | ||
| - | </ | ||
| - | |||
| - | ===== Συγκρίνοντας με χρήση ενός Comparator object ===== | ||
| - | |||
| - | [[: | ||
| - | |||
| - | <code java StudentComparator.java> | ||
| - | import java.util.*; | ||
| - | public class StudentComparator implements java.util.Comparator< | ||
| - | public int compare(Student s1, Student s2) { | ||
| - | return s1.getLastName().compareTo(s2.getLastName()); | ||
| - | } | ||
| - | } | ||
| - | </ | ||
| - | |||
| - | |Προηγούμενο: | ||