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 [2017/03/28 23:25] gthanos [Υλοποιώντας το interface Comparable για δικούς μας τύπους δεδομένων] |
java:jfc_intf_sort [2021/04/05 06:13] |
||
|---|---|---|---|
| Line 1: | Line 1: | ||
| - | ====== Ορίζοντας την σειρά καταχώρησης και ανάκτησης των δεδομένων ====== | ||
| - | |||
| - | Κατά κανόνα όταν θέλουμε να συγκρίνουμε επιμέρους αντικείμενα προκειμένου να ορίσουμε την σειρά αποθήκευσης και ανάκτησης τους σε μία δομή δεδομένων αυτό θα πρέπει να ακολουθεί κάποιους κανόνες. Για παράδειγμα, | ||
| - | |||
| - | {{ : | ||
| - | |||
| - | ===== Υλοποιώντας το interface Comparable για δικούς μας τύπους δεδομένων ===== | ||
| - | |||
| - | Παρακάτω δίνεται η υλοποίηση του interface // | ||
| - | <code java Name.java> | ||
| - | import java.util.*; | ||
| - | |||
| - | public class Name implements Comparable< | ||
| - | private final String firstName, lastName; | ||
| - | |||
| - | public Name(String firstName, String lastName) { | ||
| - | if (firstName == null || lastName == null) | ||
| - | throw new NullPointerException(); | ||
| - | this.firstName = firstName; | ||
| - | this.lastName = lastName; | ||
| - | } | ||
| - | |||
| - | public String firstName() { return firstName; } | ||
| - | public String lastName() | ||
| - | |||
| - | public boolean equals(Object o) { | ||
| - | if (!(o instanceof Name)) | ||
| - | return false; | ||
| - | Name n = (Name) o; | ||
| - | return n.firstName.equals(firstName) && n.lastName.equals(lastName); | ||
| - | } | ||
| - | |||
| - | public int hashCode() { | ||
| - | return 31*firstName.hashCode() + lastName.hashCode(); | ||
| - | } | ||
| - | |||
| - | public String toString() { | ||
| - | return firstName + " " + lastName; | ||
| - | } | ||
| - | |||
| - | public int compareTo(Name n) { | ||
| - | int lastCmp = lastName.compareTo(n.lastName); | ||
| - | return (lastCmp != 0 ? lastCmp : firstName.compareTo(n.firstName)); | ||
| - | } | ||
| - | } | ||
| - | </ | ||
| - | |||
| - | Τα βασικά χαρακτηριστικά της παραπάνω κλάσης είναι τα εξής: | ||
| - | * Έλεγχος στον κατασκευαστή εάν περνάνε ή όχι null ορίσματα. Αυτό μας προστατεύει από το να έρθουμε αντιμέτωποι με // | ||
| - | * Η μέθοδος //equal()// επαναπροσδιορίζεται, | ||
| - | * Η μέθοδος // | ||
| - | * Υλοποιείται η μέθοδος //int comparTo(T t)//. | ||
| - | |||
| - | <WRAP 85% center round tip> | ||
| - | Εξ' ορισμού (εάν δεν την επαναπροσδιορίσετε) η μέθοδος [[https:// | ||
| - | |||
| - | Σε αναλογία η μέθοδος [[https:// | ||
| - | </ | ||
| - | |||
| - | <code java NameSort.java> | ||
| - | import java.util.*; | ||
| - | |||
| - | public class NameSort { | ||
| - | public static void main(String[] args) { | ||
| - | Name nameArray[] = { | ||
| - | new Name(" | ||
| - | new Name(" | ||
| - | new Name(" | ||
| - | new Name(" | ||
| - | }; | ||
| - | |||
| - | List< | ||
| - | Collections.sort(names); | ||
| - | System.out.println(names); | ||
| - | } | ||
| - | } | ||
| - | </ | ||
| - | |||
| - | ===== Συγκρίνοντας με χρήσης ενός Comparator object ===== | ||
| - | |||
| - | Ας υποθέσουμε ότι θέλουμε να συγκρίνουμε αντικείμενα με διαφορετική μέθοδο από την μέθοδο με την οποία συγκρίνονται ή ότι θέλουμε να συγκρίνουμε αντικείμενα τα οποία δεν υλοποιούν το interface // | ||
| - | |||
| - | <code java NameComparatorSort.java> | ||
| - | import java.util.*; | ||
| - | public class NameComparatorSort { | ||
| - | static final Comparator< | ||
| - | new Comparator< | ||
| - | public int compare(Name n1, Name n2) { | ||
| - | int cmp = n1.firstName().compareTo(n2.firstName() ); | ||
| - | return (cmp != 0 ? cmp : n1.lastName().compareTo(n2.lastName() )); | ||
| - | } | ||
| - | }; | ||
| - | |||
| - | public static void main(String[] args) { | ||
| - | Name nameArray[] = { | ||
| - | new Name(" | ||
| - | new Name(" | ||
| - | new Name(" | ||
| - | new Name(" | ||
| - | }; | ||
| - | Collections.sort(Arrays.asList(nameArray), | ||
| - | for(Name n: nameArray) | ||
| - | System.out.println(n); | ||
| - | } | ||
| - | } | ||
| - | </ | ||
| - | |||
| - | Ο συγκεκριμένος // | ||
| - | |||
| - | |Προηγούμενο: | ||