This is an old revision of the document!
Table of Contents
Ανίχνευση ισότητας και σύγκριση αντικειμένων
Ανίχνευση ισότητας αντικειμένων
Εάν θέλουμε να αποθηκεύσουμε σε ένα hash table μία σειρά αντικειμένων θα πρέπει να είμαστε σίγουροι ότι δεν θα προστεθούν σε αυτό δύο ίδια αντικείμενα. Κατά συνέπεια, πρέπει να είμαστε σε θέση να προσδιορίσουμε με συνέπεια την ισότητα δύο αντικειμένων ιδίου τύπου.
Προκειμένου να μπορούμε να ανιχνεύουμε την ισότητα μεταξύ αντικειμένων η Java παρέχει τις μεθόδους public boolean equals(Object obj) και public int hashCode() της κλάσης java.lang.Object. Η μέθοδος equals επιστρέφει true εάν δύο αντικείμενα είναι ίσα, διαφορετικά επιστρέφει false. Η μέθοδος hashCode οφείλει να επιστρέφει την ίδια ακέραια τιμή για δύο διαφορετικά αλλά ίσα αντικείμενα.
Προσοχή: Εάν θέλετε να μπορείτε να ανιχνεύσετε ισότητα/ανισότητα για τα αντικείμενα μίας κλάσης θα πρέπει να είναι υλοποιημένες και οι δύο μέθοδοι με τον τρόπο που περιγράφεται παραπάνω.
Σύγκριση αντικειμένων
Εάν θέλουμε να αποθηκεύσουμε αντικείμενα σε μία δενδρική δομή λεξικού (π.χ. java.util.TreeSet είναι αναγκαίο να ορίσουμε τον τροπο σύγκρισης των αντικειμένων μεταξύ τους. Η ίδια αναγκαιότητα προκύπτει έαν θέλουμε να ταξινομήσουμε ένα σύνολο στοιχείων ή να εφαρμόσουμε δυαδική αναζήτηση σε ένα ήδη ταξινομημένο σύνολο.
Η διαδικασία της σύγκρισης επιτυγχάνεται υλοποιώντας το interface java.lang.Comparable (λεπτομέρειες εδώ), το οποίο ορίζει το κριτήριο σύγκρισης μεταξύ δύο αντικειμένων ιδίου τύπου. Οι κλάσεις της βασικής βιβλιοθήκης java.lang.String, java.util.Date κ.α. υλοποιούν το συγκεκριμένο interface ορίζοντας τον κανόνα σύγκρισης μεταξύ δύο αντικειμένων. Παρακάτω δίνεται μία σειρά από δημοφιλείς κλάσεις της java και τα κριτήρια υλοποίησης του συγκεκριμένου interface για κάθε μία από αυτές.
Υλοποιώντας το interface Comparable για δικούς μας τύπους δεδομένων
Παρακάτω δίνεται η υλοποίηση του interface java.lang.Comparable για την κλάση Student.
- 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); } }
- 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); } }
Συγκρίνοντας με χρήση ενός Comparator object
Ας υποθέσουμε ότι θέλουμε να συγκρίνουμε αντικείμενα με διαφορετική μέθοδο από την μέθοδο με την οποία συγκρίνονται ή ότι θέλουμε να συγκρίνουμε αντικείμενα τα οποία δεν υλοποιούν το interface Comparable. Σε αυτή την περίπτωση θα χρειαστούμε ένα βοηθητικό αντικείμενο του τύπου java.util.Comparator, όπως παρακάτω
- 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()); } }
Στη συνέχεια, καλούμε τη μέθοδο sort δίνοντας ως 2ο όρισμα ένα αντικείμενο της παραπάνω κλάσης. Το αντικείμενο αυτό θα υλοποιήσει τις συγκρίσεις των στοιχείων μεταξύ τους. Παρατηρήστε ότι πλέον η σειρά κατάταξης των στοιχείων με το ίδιο επίθετο “Smith” αλλάζει σε σχέση με το προηγούμενο παράδειγμα.
- 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); } }
Ένα αντικείμενο της κλάσης java.util.Comparator μας δίνει την δυνατότητα να αλλάξουμε την μέθοδο με την οποία συγκρίνονται τα αντικείμενα οποιουδήποτε τύπου δεδομένων.
Προηγούμενο: Interface java.util.Map | Περιεχόμενα | Επόμενο: SortedSet και SortedMap |