====== 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 ]] |