User Tools

Site Tools


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 [2020/03/11 20:43]
gthanos
java:jfc_intf_sort [2021/04/05 06:13]
Line 1: Line 1:
-====== Ανίχνευση ισότητας και σύγκριση αντικειμένων ====== 
- 
-===== Ανίχνευση ισότητας αντικειμένων ===== 
- 
-Εάν θέλουμε να αποθηκεύσουμε σε ένα //hash table// μία σειρά αντικειμένων θα πρέπει να είμαστε σίγουροι ότι δεν θα προστεθούν σε αυτό δύο ίδια αντικείμενα. Κατά συνέπεια, πρέπει να είμαστε σε θέση να προσδιορίσουμε με συνέπεια την ισότητα δύο αντικειμένων ιδίου τύπου.  
- 
-Προκειμένου να μπορούμε να ανιχνεύουμε την ισότητα μεταξύ αντικειμένων η Java παρέχει τις μεθόδους [[https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html#equals-java.lang.Object-|public boolean equals(Object obj)]] και [[https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html#hashCode--|public int hashCode()]] της κλάσης [[https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html|java.lang.Object]]. Η μέθοδος //equals// επιστρέφει //true// εάν δύο αντικείμενα είναι ίσα, διαφορετικά επιστρέφει //false//. Η μέθοδος //hashCode// οφείλει να επιστρέφει την ίδια ακέραια τιμή για δύο διαφορετικά αλλά ίσα αντικείμενα.  
- 
-**Προσοχή:** Εάν θέλετε να μπορείτε να ανιχνεύσετε ισότητα/ανισότητα για τα αντικείμενα μίας κλάσης θα πρέπει να είναι υλοποιημένες __και οι δύο μέθοδοι__ με τον τρόπο που περιγράφεται παραπάνω.  
- 
-==== Υλοποιώντας την ισότητα αντικειμένων τύπου Student ==== 
- 
-Παρακάτω δίνεται η κλάση Student ενημερωμένη ώστε να περιέχει τις υλοποιήσεις των συναρτήσεων [[https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html#equals-java.lang.Object-|equals]] και [[https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html#hashCode--|hashCode]]. 
- 
-<code java Student.java> 
-public class Student implements java.lang.Comparable<Student> { 
-  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+" "+lastName; 
-  } 
-   
-  public boolean equals(Object o) { 
-    return (o instanceof Student && o.hashCode() == this.hashCode()); 
-  } 
-   
-  public int hashCode() { 
-    return 3 * firstName.hashCode() + 5 * lastName.hashCode(); 
-  } 
-} 
-</code> 
- 
-Παρατηρήστε ότι η μέθοδος equals επιστρέφει true εάν η παράμετρος ''Object ο'' είναι του τύπου της τρέχουσας κλάσης (δηλαδή Student) και έχει την ίδια τιμή hashCode με το τρέχον αντικείμενο. Αυτός είναι ένας τυπικός τρόπος για να ορίσετε τη συγκεκριμένη συνάρτηση. 
- 
-Η μέθοδος hashCode πρέπει να επιστρέφει την ίδια ακέραια τιμή για δύο ισα αντικείμενα. Για το συγκεκριμένο παράδειγμα είναι αναγκαίο να έχουμε υπόψη μας ότι η κλάση [[java.lang.String]] υλοποιεί τη συνάρτηση hashCode υπακούοντας στη συγκεκριμένη αρχή. Η παραπάνω υλοποίηση αποκλείει να έχουμε δύο διαφορετικά αντικείμενα όπου το ένα να είναι διαφορετικό από το άλλο και να έχουν το ίδιo hashCode(). 
- 
-===== Σύγκριση αντικειμένων ===== 
- 
-Εάν θέλουμε να αποθηκεύσουμε αντικείμενα σε μία δενδρική δομή λεξικού (π.χ. [[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 για κάθε μία από αυτές. 
- 
-{{ :java:object-ordering.png?450 |}} 
- 
-==== Υλοποιώντας το interface Comparable για δικούς μας τύπους δεδομένων ==== 
- 
-Παρακάτω δίνεται η υλοποίηση του interface [[https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html|java.lang.Comparable]] για την κλάση Student. 
- 
-<code java Student.java> 
-public class Student implements java.lang.Comparable<Student> { 
-  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+" "+lastName; 
-  } 
-   
-  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); 
-  } 
-} 
-</code> 
- 
-===== Συγκρίνοντας με χρήση ενός 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]], όπως παρακάτω 
- 
-<code java StudentComparator.java> 
-import java.util.*; 
-public class StudentComparator implements java.util.Comparator<Student> { 
-  public int compare(Student s1, Student s2) { 
-    return s1.getLastName().compareTo(s2.getLastName()); 
-  } 
-} 
-</code> 
- 
-|Προηγούμενο: [[:java:jfc_intf_map | Interface java.util.Map ]] | [[:toc | Περιεχόμενα ]] | Επόμενο: [[:java:jfc_intf_sorted_set_map | SortedSet και SortedMap ]] | 
  
java/jfc_intf_sort.txt · Last modified: 2021/04/05 06:13 (external edit)