This is an old revision of the document!
Table of Contents
Interface java.util.Collection
Το βασικό Interface στην Java το οποίο αποτελεί το ελάχιστον κοινό Interface των Set, List, Queue, Dequeue.
Διάτρεξη ενός Collection
To interface java.util.Collection είναι απόγονος του interface java.lang.Iterable. Ως εκ τούτου, η διάτρεξη οποιουδήποτε Collection μπορεί να γίνει με δύο τρόπους
- μέσω For-Each Loop.
- με τη βοήθεια ενός java.util.Iterator.
1ος τρόπος - For-Each Loop
- StudentCollection.java
import java.util.*; import java.lang.*; public class StudentCollection { public static void iterateCollection(Collection<Student> students) { for(Student st: students) { System.out.println(st.toString()); } } public static void main(String args[]) { students = new LinkedList<Student>(); 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
Μπορείτε να αντικαταστήσετε την iterateList
με την παρακάτω υλοποίηση
public void iterateList() { Iterator<Student> it = students.iterator(); while( it.hasNext() ) { System.out.println(it.next().toString()); } }
Συνιστάται ο 2ος τρόπος αντί για τον 1ο εάν θέλετε καθώς διατρέχετε τη συλλογή να διαγράφετε και εγγραφές.
Βασικές μέθοδοι
- isEmpty(): Εξετάζει αν το Collection έχει περιεχόμενα ή όχι επιστρέφοντας true/false.
- size(): Επιστρέφει τον αριθμό των αντικειμένων που περιέχει το Collection ή μηδέν αν είναι άδειο.
- iterator(): Επιστρέφει ένα Iterator<E> object για την διάτρεξη του Collection.
Εργασίες με πολλαπλές εγγραφές
- clear() - Διαγράφει όλα τα περιεχόμενα του Collection.
- containsAll(Collection<?> c) - Επιστρέφει true εάν υπάρχουν όλα τα μέλη της
c
στην αρχική λίστα. Διαφορετικά επιστρέφει false.
- StudentCollection.java
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
είναι η παράμετρος κλάση του Collection να υλοποιεί τις μεθόδους equals
και hashCode
. Εάν αφαιρέσετε έστω και μία από τις μεθόδους αυτές από την υλοποίηση της κλάσης Student θα παρατηρήσετε ότι η μέθοδος containsAll
δεν αναγνωρίζει τα αντικείμενα της μεταβλητής sts
ως αντίγραφα εκείνων που περιέχονται στην αρχική λίστα φοιτητών students
.
* addAll(Collection<?> c) - Προσθέτει όλες τις εγγραφές που περιέχονται στο Collection c
.
- StudentCollection.java
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<>();
Τι παρατηρείτε; Γιατί συμβαίνει αυτό;
- removeAll(Collection<?> c) - Αφαιρεί όλες τις εγγραφές που περιέχονται στο Collection
c
.
- StudentCollection.java
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 |