This is an old revision of the document!
Το βασικό Interface στην Java το οποίο αποτελεί το ελάχιστον κοινό Interface των Set, List, Queue, Dequeue.
import java.util.*; import java.lang.*; public class StudentCollection { private Collection<Student> students; public StudentCollection() { students = new LinkedList<Student>(); populateList(); } public final void populateList() { students.add(new Student("John", "Smith")); students.add(new Student("Stanley", "Peters")); students.add(new Student("Edgar", "Bloch")); students.add(new Student("Suzan", "Miles")); students.add(new Student("Mary", "Poppins")); } public void iterateList() { for(Student st: students) { System.out.println(st.toString()); } } public static void main(String args[]) { StudentCollection stl = new StudentCollection(); stl.iterateList(); } }
Μπορείτε να αντικαταστήσετε την iterateList με την παρακάτω υλοποίηση
public void iterateList() { Iterator<Student> it = students.iterator(); while( it.hasNext() ) { System.out.println(it.next().toString()); } }
Συνιστάται ο 2ος τρόπος αντί για τον 1ο εάν θέλετε καθώς διατρέχετε τη συλλογή να διαγράφετε και εγγραφές.
c στην αρχική λίστα. Διαφορετικά επιστρέφει false.import java.util.*; import java.lang.*; import java.util.*; import java.lang.*; public class StudentCollection { public static void main(String args[]) { Collection<Student> students = new ArrayList<>(); students.add(new Student("John", "Smith")); students.add(new Student("Stanley", "Peters")); students.add(new Student("Edgar", "Bloch")); students.add(new Student("Suzan", "Miles")); students.add(new Student("Mary", "Poppins")); Collection <Student> sts = new LinkedList<Student>(); sts.add(new Student("John", "Smith")); sts.add(new Student("Stanley", "Peters")); if( students.containsAll(sts) ) { System.out.println("containsAll:TRUE"); } else { System.out.println("containsAll:FALSE"); } } }
Εάν μεταγλωττίσετε και εκτελέσετε το παραπάνω πρόγραμμα θα δείτε ότι εκτυπώνει το μήνυμα containsAll:FALSE παρά το γεγονός ότι η δεύτερη λίστα περιέχει δύο αντικείμενα τύπου Student τα οποία έχουν τα ίδια πεδία με αντικείμενα που περιέχονται στο Collection students. O λόγος που η συνάρτηση containsAll επιστρέφει false είναι ότι πρόκειται για διαφορετικά αντικείμενα, δηλαδή για αντικείμενα με διαφορετική τιμή επιστροφής της συνάρτησης hashCode().
O τρόπος για να λύσουμε το συγκεκριμένο πρόβλημα είναι να ορίσουμε τις συναρτήσεις hashCode και equals για την κλάση Student (ορίζονται στην κλάση Object), όπως παρακάτω:
public boolean equals(Object o) { return (o instanceof Student && o.hashCode() == this.hashCode()); } public int hashCode() { return firstName.hashCode() + 2 * lastName.hashCode(); }
Απαραίτητη προϋπόθεση για να δουλεύει σωστά η συνάρτηση equals είναι δύο ίδια αντικείμενα να διαθέτουν την ίδια τιμή επιστροφής της συνάρτησης hashCode.
Θέλουμε η συνάρτηση hashCode για δύο αντικείμενα στα οποία έχουμε αντιμεταθέσει τα πεδία firstName, lastName να επιστρέφει διαφορετικές τιμές .
* addAll(Collection<?> c) - Προσθέτει όλες τις εγγραφές που περιέχονται στο Collection c.
import java.util.*; public class StudentCollection { public static void main(String args[]) { Collection<Student> students = new ArrayList<>(); students.add(new Student("John", "Smith")); students.add(new Student("Stanley", "Peters")); students.add(new Student("Edgar", "Bloch")); students.add(new Student("Suzan", "Miles")); students.add(new Student("Mary", "Poppins")); Collection <Student> sts = new LinkedList<Student>(); sts.add(new Student("John", "Smith")); sts.add(new Student("Stanley", "Peters")); students.addAll(sts); print(students); } public static void print(Collection<Student> collection) { Iterator<Student> it = collection.iterator(); while(it.hasNext()) System.out.println(it.next()); } }
Στον παραπάνω κώδικα αντικαταστήστε την πρώτη γραμμή της main με
Collection<Student> students = new HashSet<>();
Τι παρατηρείτε; Γιατί συμβαίνει αυτό;
c.import java.util.*; public class StudentCollection { public static void main(String args[]) { Collection<Student> students = new ArrayList<>(); students.add(new Student("John", "Smith")); students.add(new Student("Stanley", "Peters")); students.add(new Student("Edgar", "Bloch")); students.add(new Student("Suzan", "Miles")); students.add(new Student("Mary", "Poppins")); Collection <Student> sts = new LinkedList<Student>(); sts.add(new Student("John", "Smith")); sts.add(new Student("Stanley", "Peters")); students.addAll(sts); students.removeAll(sts); print(students); } public static void print(Collection<Student> collection) { Iterator<Student> it = collection.iterator(); while(it.hasNext()) System.out.println(it.next()); } }
Παρατηρήστε ότι η μέθοδος removeAll αφαιρεί το σύνολο των εγγραφών ακόμη και εάν μία εγγραφή εμφανίζεται περισσότερες από μία φορές.
| Προηγούμενο: JCF Interfaces | Περιεχόμενα | Επόμενο: Interface java.util.Set |