java:jfc_intf_collection

This is an old revision of the document!


A PCRE internal error occured. This might be caused by a faulty plugin

====== 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() ==== <code java StudentCollection.java> 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(); } } </code> ==== 2ος τρόπος - iterator ==== Μπορείτε να αντικαταστήσετε την ''iterateList'' με την παρακάτω υλοποίηση. Ο τύπος [[http://docs.oracle.com/javase/7/docs/api/java/util/Iterator.html|Iterator<Τ>]] είναι ένας παραμετρικός τύπος δεδομένων (ένα interface) που επιτρέπει την διάτρεξη του Collection από την αρχή έως το τέλος. <code java> public void iterateList() { Iterator<Student> it = students.iterator(); while( it.hasNext() ) { System.out.println(it.next().toString()); } } </code> Στο παραπάνω παράδειγμα οι δύο μέθοδοι ''iterateList()'' είναι ισοδύναμες. Το πλεονέκτημα του iterator είναι ότι σας επιτρέπει να διαγράφετε εγγραφές καθώς διατρέχετε τη συλλογή. Συγκεκριμένα, μπορείτε να διαγράφετε εγγραφές μέσω της μεθόδου [[http://docs.oracle.com/javase/7/docs/api/java/util/Iterator.html#remove()|remove()]] του iterator. Για παράδειγμα, η παρακάτω μέθοδος διαγράφει όλα τα δεδομένα της συλλογής: <code java> <code java> public void clearCollection() { Iterator<Student> it = students.iterator(); while( it.hasNext() ) { it.remove(); } } </code> ===== Βασικές μέθοδοι ===== * **[[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<E>]] 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. <code java StudentCollection.java> 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 static void main(String args[]) { StudentCollection stl = new StudentCollection(); Collection <Student> sts = stl.getStudents(); // comment out this line and uncomment the following comments /* Collection <Student> sts = new LinkedList<Student>(); 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"); } } } </code> Στην συνέχεια βάλτε σχόλια στην γραμμή που υποδεικνύουν τα σχόλια και αφαιρέστε το τμήμα του κώδικα που είναι σε σχόλια. Μεταγλωττίστε και τρέξτε. Ποιό είναι το αποτέλεσμα αυτή την φορά; Γιατί συμβαίνει αυτό; <WRAP center 70% round tip> Όταν συγκρίνονται δύο //Collections// ως προς τα περιεχόμενα τους συγκρίνουμε εάν η πρώτη περιέχει __τα ίδια ακριβώς__ στοιχεία με την δεύτερη, δηλαδή τα ίδια ακριβώς objects. Εάν δημιουργηθούν αντίγραφα των objects της μίας και τοποθετηθούν στην 2η η σύγκριση των περιεχομένων δεν επιστρέφει ισότητα. </WRAP> * **[[https://docs.oracle.com/javase/7/docs/api/java/util/Collection.html#addAll%28java.util.Collection%29|addAll(Collection<?> c)]]** - Προσθέτει όλες τις εγγραφές που περιέχονται στο Collection ''c''. <code java StudentCollection.java> 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(); } } </code> * **[[https://docs.oracle.com/javase/7/docs/api/java/util/Collection.html#removeAll(java.util.Collection)|removeAll(Collection<?> c)]]** - Αφαιρεί όλες τις εγγραφές που περιέχονται στο Collection ''c''. <code java StudentCollection.java> 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(); } } </code> <WRAP center 70% round tip> Και εδώ ισχύει ότι αναφέραμε παραπάνω αναφορικά με την σύγκριση των //Collections//. Eάν η λίστα //sts// δημιουργηθεί από αντίγραφα των αντικειμένων της λίστας //stl//, η μέθοδος //removeAll// δεν θα αφαιρέσει τίποτα. </WRAP>

java/jfc_intf_collection.1487346930.txt.gz · Last modified: 2017/02/17 15:55 by gthanos