User Tools

Site Tools


java:jfc_intf_collection

Interface java.util.Collection

Το βασικό Interface στην Java το οποίο αποτελεί το ελάχιστον κοινό Interface των Set, List, Queue, Dequeue.

Διάτρεξη ενός Collection

To interface java.util.Collection είναι απόγονος του interface java.lang.Iterable. Ως εκ τούτου, η διάτρεξη οποιουδήποτε Collection μπορεί να γίνει με δύο τρόπους

  1. μέσω For-Each Loop.
  2. με τη βοήθεια ενός 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[]) {
    Collection<Student> students;
    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

Μπορείτε να αντικαταστήσετε την iterateCollection με την παρακάτω υλοποίηση

  public static void iterateCollection(Collection<Student> students) {  
    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<>();

Τι παρατηρείτε; Γιατί συμβαίνει αυτό;

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 αφαιρεί το σύνολο των εγγραφών ακόμη και εάν μία εγγραφή εμφανίζεται περισσότερες από μία φορές.

java/jfc_intf_collection.txt · Last modified: 2021/05/22 02:47 (external edit)