====== java.util.Collection ====== To interface Collection περιγράφει μία συλλογή στοιχείων ιδίου τύπου. Αποτελεί το ελάχιστο κοινό interface των [[java:jfc_intf_set|Set]], [[java:jfc_intf_list|List]], [[https://docs.oracle.com/javase/7/docs/api/java/util/Queue.html|Queue]]. ===== Διάτρεξη ενός Collection ===== ==== 1ος τρόπος - for() ==== import java.util.*; import java.lang.*; public class StudentCollection { private Collection students; public StudentCollection() { students = new LinkedList(); 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(); } } ==== 2ος τρόπος - iterator ==== Μπορείτε να αντικαταστήσετε την ''iterateList'' με την παρακάτω υλοποίηση. Ο τύπος [[http://docs.oracle.com/javase/7/docs/api/java/util/Iterator.html|Iterator<Τ>]] είναι ένας παραμετρικός τύπος δεδομένων (ένα interface) που επιτρέπει την διάτρεξη του Collection από την αρχή έως το τέλος. public void iterateList() { Iterator it = students.iterator(); while( it.hasNext() ) { System.out.println(it.next().toString()); } } Στο παραπάνω παράδειγμα οι δύο μέθοδοι ''iterateList()'' είναι ισοδύναμες. Το πλεονέκτημα του iterator είναι ότι σας επιτρέπει να διαγράφετε εγγραφές καθώς διατρέχετε τη συλλογή. Συγκεκριμένα, μπορείτε να διαγράφετε εγγραφές μέσω της μεθόδου [[http://docs.oracle.com/javase/7/docs/api/java/util/Iterator.html#remove()|remove()]]. Για παράδειγμα, η παρακάτω μέθοδος διαγράφει όλα τα δεδομένα της συλλογής: public void clearCollection() { Iterator it = students.iterator(); while( it.hasNext() ) { it.remove(); } } ===== Βασικές μέθοδοι ===== * **[[https://docs.oracle.com/javase/7/docs/api/java/util/Collection.html#isEmpty()|isEmpty()]]:** Εξετάζει αν το Collection έχει περιεχόμενα ή όχι επιστρέφοντας true/false. * **[[https://docs.oracle.com/javase/7/docs/api/java/util/Collection.html#size()|size()]]:** Επιστρέφει τον αριθμό των αντικειμένων που περιέχει το Collection ή μηδέν αν είναι άδειο. * **[[https://docs.oracle.com/javase/7/docs/api/java/util/Collection.html#iterator()|iterator()]]:** Επιστρέφει ένα [[https://docs.oracle.com/javase/7/docs/api/java/util/Iterator.html|Iterator]] object για την διάτρεξη του Collection. ===== Εργασίες με πολλαπλές εγγραφές ===== * **[[https://docs.oracle.com/javase/7/docs/api/java/util/Collection.html#clear()|clear()]]** - Διαγράφει όλα τα περιεχόμενα του Collection. * **[[https://docs.oracle.com/javase/7/docs/api/java/util/Collection.html#containsAll%28java.util.Collection%29|containsAll(Collection c)]]** - Επιστρέφει true εάν υπάρχουν όλα τα μέλη της ''c'' στην αρχική λίστα. Διαφορετικά επιστρέφει false. import java.util.*; import java.lang.*; import java.util.*; import java.lang.*; public class StudentCollection { private Collection students; public StudentCollection() { students = new LinkedList(); 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 getStudents() { return students; } public static void main(String args[]) { StudentCollection stl = new StudentCollection(); Collection sts = stl.getStudents(); // comment out this line and uncomment the following comments /* Collection sts = new LinkedList(); sts.add(new Student("John", "Smith")); sts.add(new Student("Stanley", "Peters")); */ if( stl.getStudents().containsAll(sts) ) { System.out.println("containsAll:TRUE"); } else { System.out.println("containsAll:FALSE"); } } } Στην συνέχεια βάλτε σχόλια στην γραμμή που υποδεικνύουν τα σχόλια και αφαιρέστε το τμήμα του κώδικα που είναι σε σχόλια. Μεταγλωττίστε και τρέξτε. Ποιό είναι το αποτέλεσμα αυτή την φορά; Γιατί συμβαίνει αυτό; Όταν συγκρίνονται δύο //Collections// ως προς τα περιεχόμενα τους συγκρίνουμε εάν το πρώτο περιέχει __τα ίδια__ στοιχεία με το δεύτερο, δηλαδή τα ίδια αντικείμενα. Εάν δημιουργηθούν αντίγραφα των αντικειμένων της μίας και τοποθετηθούν στην 2η η σύγκριση των περιεχομένων δεν επιστρέφει ισότητα. * **[[https://docs.oracle.com/javase/7/docs/api/java/util/Collection.html#addAll%28java.util.Collection%29|addAll(Collection c)]]** - Προσθέτει όλες τις εγγραφές που περιέχονται στο Collection ''c''. import java.util.*; import java.lang.*; import java.util.*; import java.lang.*; public class StudentCollection { private Collection students; public StudentCollection() { students = new LinkedList(); 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 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 sts = new LinkedList(); sts.add(new Student("Lena", "Travolta")); sts.add(new Student("George", "Thanos")); stl.getStudents().addAll(sts); stl.iterateList(); } } * **[[https://docs.oracle.com/javase/7/docs/api/java/util/Collection.html#removeAll(java.util.Collection)|removeAll(Collection c)]]** - Αφαιρεί όλες τις εγγραφές που περιέχονται στο Collection ''c''. import java.util.*; import java.lang.*; import java.util.*; import java.lang.*; public class StudentCollection { private Collection students; public StudentCollection() { students = new LinkedList(); 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 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 sts = new LinkedList(); //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// δεν θα αφαιρέσει κανένα στοιχείο. Αφαίρεση αντικειμένων θα γίνει μόνο για αντικείμενα που ανήκουν ταυτόχρονα στις συλλογές //stl// και //sts//.