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() == hashCode); } public int hashCode() { return firstName.hashCode() + 2 * lastName.hashCode(); }
Απαραίτητη προϋπόθεση για να δουλεύει σωστά η συνάρτηση equals είναι δύο ίδια αντικείμενα να διαθέτουν την ίδια τιμή επιστροφής της συνάρτησης hashCode.
Θέλουμε η συνάρτηση hashCode για δύο αντικείμενα στα οποία έχουμε αντιμεταθέσει τα πεδία firstName, lastName να επιστρέφει διαφορετικές τιμές .
* addAll(Collection<?> c) - Προσθέτει όλες τις εγγραφές που περιέχονται στο Collection c.
import java.util.*; import java.lang.*; 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 Collection<Student> getStudents() { return students; } public void iterateList() { for(Student st: students) { System.out.println(st.toString()); } } public static void main(String args[]) { StudentCollection stl = new StudentCollection(); Collection <Student> sts = new LinkedList<Student>(); sts.add(new Student("Lena", "Travolta")); sts.add(new Student("George", "Thanos")); stl.getStudents().addAll(sts); stl.iterateList(); } }
c.import java.util.*; import java.lang.*; 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 Collection<Student> getStudents() { return students; } public void iterateList() { for(Student st: students) { System.out.println(st.toString()); } } public static void main(String args[]) { StudentCollection stl = new StudentCollection(); Collection <Student> sts = new LinkedList<Student>(); //comment for statement int i=0; for(Student st : stl.getStudents()) { sts.add(st); if(++i==2) break; } //and uncomment this code below /* sts.add(new Student("John", "Smith")); sts.add(new Student("Stanley", "Peters")); */ stl.getStudents().removeAll(sts); stl.iterateList(); } }
Και εδώ ισχύει ότι αναφέραμε παραπάνω αναφορικά με την σύγκριση των Collections. Eάν η λίστα sts δημιουργηθεί από αντίγραφα των αντικειμένων της λίστας stl, η μέθοδος removeAll δεν θα αφαιρέσει τίποτα.
| Προηγούμενο: JCF Interfaces | Περιεχόμενα | Επόμενο: Interface java.util.Set |