This is an old revision of the document!
Κατά κανόνα όταν θέλουμε να συγκρίνουμε επιμέρους αντικείμενα προκειμένου να ορίσουμε την σειρά αποθήκευσης και ανάκτησης τους σε μία δομή δεδομένων αυτό θα πρέπει να ακολουθεί κάποιους κανόνες. Για παράδειγμα, εάν συγκρίνουμε δύο String, αυτά θα συγκριθούν με βάση συγκεκριμένα κριτήρια λεξικού. Αντίστοιχα, αν συγκρίνουμε δύο ημερομηνίες αυτές θα συγκριθούν με βάση τις ημερομηνίες που αντιπροσωπεύουν. Γενικότερα στην java ορίζεται το interface Comparable το οποίο ορίζει τα κριτήρια σύγκρισης μεταξύ δύο αντικειμένων του ιδίου τύπου. Οι κλάσεις της standard βιβλιοθήκης String, Date, Integer κ.α. υλοποιούν το συγκεκριμένο interface ορίζοντας τους κανόνες σύγκρισης. Παρακάτω δίνεται μία σειρά από δημοφιλείς κλάσεις της java και τα κριτήρια υλοποίησης του συγκεκριμένου interface για κάθε μία από αυτές.
Παρακάτω δίνεται η υλοποίηση του interface Comparable για την κλάση Student.
public class Student implements Comparable<Student> { private String firstName; private String lastName; public Student(String fname, String lname) { firstName = fname; lastName = lname; } 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); } }
import java.util.*; public class StudentSort { public static void main(String[] args) { List<Student> list = new ArrayList<>(); list.add(new Name("John", "Smith")); list.add(new Name("Karl", "Negt")); list.add(new Name("Jeff", "Smith")); list.add(new Name("Tom", "Rich")); Collections.sort(list); System.out.println(names); } }
Ας υποθέσουμε ότι θέλουμε να συγκρίνουμε αντικείμενα με διαφορετική μέθοδο από την μέθοδο με την οποία συγκρίνονται ή ότι θέλουμε να συγκρίνουμε αντικείμενα τα οποία δεν υλοποιούν το interface Comparable. Σε αυτή την περίπτωση θα χρειαστοούμε ένα βοηθητικό αντικείμενο του τύπου Comparator, όπως παρακάτω
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); } }
Ο συγκεκριμένος Comparator μας δίνει την δυνατότητα να αλλάξουμε την μέθοδο με την οποία συγκρίνονται τα αντικείμενα του συγκεκριμένου τύπου δεδομένων δίνοντας προτεραιότητα στο μικρό όνομα αντί για το επίθετο.
| Προηγούμενο: Interface java.util.Map | Περιεχόμενα | Επόμενο: SortedSet και SortedMap |