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 07:44]
gthanos [Υλοποιώντας το interface Comparable για δικούς μας τύπους δεδομένων]
java:jfc_intf_sort [2021/04/05 06:13]
Line 1: Line 1:
-====== Ορίζοντας την σειρά καταχώρησης και ανάκτησης των δεδομένων ====== 
- 
-Κατά κανόνα όταν θέλουμε να συγκρίνουμε επιμέρους αντικείμενα προκειμένου να ορίσουμε την σειρά αποθήκευσης και ανάκτησης τους σε μία δομή δεδομένων αυτό θα πρέπει να ακολουθεί κάποιους κανόνες. Για παράδειγμα, εάν συγκρίνουμε δύο String, αυτά θα συγκριθούν με βάση συγκεκριμένα κριτήρια λεξικού. Αντίστοιχα, αν συγκρίνουμε δύο ημερομηνίες αυτές θα συγκριθούν με βάση τις ημερομηνίες που αντιπροσωπεύουν. Γενικότερα στην java ορίζεται το interface //[[http://docs.oracle.com/javase/7/docs/api/java/lang/Comparable.html|Comparable]]// το οποίο ορίζει τα κριτήρια σύγκρισης μεταξύ δύο αντικειμένων του ιδίου τύπου. Οι κλάσεις της standard βιβλιοθήκης String, Date, Integer κ.α. υλοποιούν το συγκεκριμένο 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> 
- 
-<code java StudentsSort.java> 
-import java.util.*; 
- 
-public class StudentsSort { 
-  public static void main(String[] args) { 
-    List<Student> list = new ArrayList<>(); 
-    list.add(new Student("John", "Smith")); 
-    list.add(new Student("Karl", "Negt")); 
-    list.add(new Student("Jeff", "Smith")); 
-    list.add(new Student("Tom", "Rich")); 
- 
-    Collections.sort(list); 
-    System.out.println(list); 
-  } 
-} 
-</code> 
- 
-===== Συγκρίνοντας με χρήση ενός Comparator object ===== 
- 
-Ας υποθέσουμε ότι θέλουμε να συγκρίνουμε αντικείμενα με διαφορετική μέθοδο από την μέθοδο με την οποία συγκρίνονται ή ότι θέλουμε να συγκρίνουμε αντικείμενα τα οποία δεν υλοποιούν το 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> 
- 
-Στη συνέχεια, καλούμε τη μέθοδο sort δίνοντας ως 2ο όρισμα ένα αντικείμενο της παραπάνω κλάσης. Το αντικείμενο αυτό θα υλοποιήσει τις συγκρίσεις των στοιχείων μεταξύ τους. Παρατηρήστε ότι πλέον η σειρά κατάταξης των στοιχείων με το ίδιο επίθετο "Smith" αλλάζει σε σχέση με το προηγούμενο παράδειγμα. 
- 
-<code java StudentSortUsingComparator.java> 
-public class StudentSortUsingComparator { 
-  public static void main(String[] args) { 
-    List<Student> list = new ArrayList<>(); 
-    list.add(new Student("John", "Smith")); 
-    list.add(new Student("Karl", "Negt")); 
-    list.add(new Student("Jeff", "Smith")); 
-    list.add(new Student("Tom", "Rich")); 
- 
-    Collections.sort(list, new StudentComparator()); 
-    System.out.println(list); 
-  } 
-} 
-</code> 
- 
-Ένα αντικείμενο της κλάσης [[http://docs.oracle.com/javase/7/docs/api/java/util/Comparator.html|java.util.Comparator]] μας δίνει την δυνατότητα να αλλάξουμε την μέθοδο με την οποία συγκρίνονται τα αντικείμενα οποιουδήποτε τύπου δεδομένων. 
- 
-|Προηγούμενο: [[: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)