====== Interface java.util.Collection ====== Το βασικό Interface στην Java το οποίο αποτελεί το ελάχιστον κοινό Interface των //Set//, //List//, //Queue//, //Dequeue//. ===== Διάτρεξη ενός Collection ===== To interface [[https://docs.oracle.com/javase/8/docs/api/java/util/Collection.html|java.util.Collection]] είναι απόγονος του interface [[https://docs.oracle.com/javase/8/docs/api/java/lang/Iterable.html|java.lang.Iterable]]. Ως εκ τούτου, η διάτρεξη οποιουδήποτε Collection μπορεί να γίνει με δύο τρόπους - μέσω For-Each Loop. - με τη βοήθεια ενός [[https://docs.oracle.com/javase/8/docs/api/java/util/Iterator.html|java.util.Iterator]]. ==== 1ος τρόπος - For-Each Loop ==== import java.util.*; import java.lang.*; public class StudentCollection { public static void iterateCollection(Collection students) { for(Student st: students) { System.out.println(st.toString()); } } public static void main(String args[]) { Collection students; students = new LinkedList(); 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")); iterateCollection(students); } } ==== 2ος τρόπος - iterator ==== Μπορείτε να αντικαταστήσετε την ''iterateCollection'' με την παρακάτω υλοποίηση public static void iterateCollection(Collection students) { Iterator it = students.iterator(); while( it.hasNext() ) { System.out.println(it.next().toString()); } } Συνιστάται ο 2ος τρόπος αντί για τον 1ο εάν θέλετε καθώς διατρέχετε τη συλλογή να διαγράφετε και εγγραφές. ===== Βασικές μέθοδοι ===== * **[[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 { public static void main(String args[]) { Collection 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 sts = new LinkedList(); 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'' είναι η παράμετρος κλάση του Collection να υλοποιεί τις μεθόδους ''equals'' και ''hashCode''. Εάν αφαιρέσετε έστω και μία από τις μεθόδους αυτές από την υλοποίηση της κλάσης Student θα παρατηρήσετε ότι η μέθοδος ''containsAll'' δεν αναγνωρίζει τα αντικείμενα της μεταβλητής ''sts'' ως αντίγραφα εκείνων που περιέχονται στην αρχική λίστα φοιτητών ''students''. * **[[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.*; public class StudentCollection { public static void main(String args[]) { Collection 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 sts = new LinkedList(); sts.add(new Student("John", "Smith")); sts.add(new Student("Stanley", "Peters")); students.addAll(sts); print(students); } public static void print(Collection collection) { Iterator it = collection.iterator(); while(it.hasNext()) System.out.println(it.next()); } } Στον παραπάνω κώδικα αντικαταστήστε την πρώτη γραμμή της ''main'' με Collection students = new HashSet<>(); Τι παρατηρείτε; Γιατί συμβαίνει αυτό; * **[[https://docs.oracle.com/javase/7/docs/api/java/util/Collection.html#removeAll(java.util.Collection)|removeAll(Collection c)]]** - Αφαιρεί όλες τις εγγραφές που περιέχονται στο Collection ''c''. import java.util.*; public class StudentCollection { public static void main(String args[]) { Collection 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 sts = new LinkedList(); 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 collection) { Iterator it = collection.iterator(); while(it.hasNext()) System.out.println(it.next()); } } Παρατηρήστε ότι η μέθοδος ''removeAll'' αφαιρεί το σύνολο των εγγραφών ακόμη και εάν μία εγγραφή εμφανίζεται περισσότερες από μία φορές. |Προηγούμενο: [[:java:jfc_interfaces | JCF Interfaces ]] | [[:toc | Περιεχόμενα ]] | Επόμενο: [[:java:jfc_intf_set | Interface java.util.Set ]] |