java:jfc_intf_sort

This is an old revision of the document!


A PCRE internal error occured. This might be caused by a faulty plugin

====== Ορίζοντας την σειρά καταχώρησης και ανάκτησης των δεδομένων ====== Κατά κανόνα όταν θέλουμε να συγκρίνουμε επιμέρους αντικείμενα προκειμένου να ορίσουμε την σειρά αποθήκευσης και ανάκτησης τους σε μία δομή δεδομένων αυτό θα πρέπει να ακολουθεί κάποιους κανόνες. Για παράδειγμα, εάν συγκρίνουμε δύο String, αυτά θα συγκριθούν με βάση συγκεκριμένα κριτήρια λεξικού. Αντίστοιχα, αν συγκρίνουμε δύο ημερομηνίες αυτές θα συγκριθούν με βάση τις ημερομηνίες που αντιπροσωπεύουν. Γενικότερα στην java ορίζεται το interface //[[http://docs.oracle.com/javase/7/docs/api/java/lang/Comparable.html|Comparable]]// το οποίο ορίζει τα κριτήρια σύγκρισης δύο ίδιων αντικειμένων μεταξύ τους. Οι κλάσεις String, Date, Integer κ.α. υλοποιούν το συγκεκριμένο interface ορίζοντας τους κανόνες σύγκρισης. Παρακάτω δίνεται μία σειρά από δημοφιλείς κλάσεις της java και τα κριτήρια υλοποίησης του συγκεκριμένου interface για κάθε μία από αυτές. {{ :java:object-ordering.png?450 |}} ===== Υλοποιώντας το interface Comparable για δικούς μας τύπους δεδομένων ===== Παρακάτω δίνεται η υλοποίηση του interface //Comparable// για την κλάση Name. <code java Name.java> import java.util.*; public class Name implements Comparable<Name> { 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() { return 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)); } } </code> Τα βασικά χαρακτηριστικά της παραπάνω κλάσης είναι τα εξής: * Έλεγχος στον κατασκευαστή εάν περνάνε ή όχι null ορίσματα. Αυτό μας προστατεύει από το να έρθουμε αντιμέτωποι με //NullPointerException// στην συνέχεια. * Η μέθοδος //hashCode()// επαναπροσδιορίζεται. * Η μέθοδος //equal()// επαναπροσδιορίζεται. * Υλοποιείται η μέθοδος //int comparTo(T t)//. <code java NameSort.java> import java.util.*; public class NameSort { public static void main(String[] args) { Name nameArray[] = { new Name("John", "Smith"), new Name("Karl", "Ng"), new Name("Jeff", "Smith"), new Name("Tom", "Rich") }; List<Name> names = Arrays.asList(nameArray); Collections.sort(names); System.out.println(names); } } </code> <code java NameComparatorSort.java> import java.util.*; public class NameComparatorSort { static final Comparator<Name> NameOrdering = new Comparator<Name>() { 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("John", "Smith"), new Name("Karl", "Ng"), new Name("Jeff", "Smith"), new Name("Tom", "Rich") }; Collections.sort(Arrays.asList(nameArray), NameOrdering); for(Name n: nameArray) System.out.println(n); } } </code>

java/jfc_intf_sort.1426599385.txt.gz · Last modified: 2016/02/26 11:15 (external edit)