java:jfc_intf_collection

java.util.Collection

To interface Collection περιγράφει μία συλλογή στοιχείων ιδίου τύπου. Αποτελεί το ελάχιστο κοινό interface των Set, List, Queue.

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

1ος τρόπος - for()

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();
  }
} 

2ος τρόπος - iterator

Μπορείτε να αντικαταστήσετε την iterateList με την παρακάτω υλοποίηση. Ο τύπος Iterator<Τ> είναι ένας παραμετρικός τύπος δεδομένων (ένα interface) που επιτρέπει την διάτρεξη του Collection από την αρχή έως το τέλος.

  public void iterateList() {  
    Iterator<Student> it = students.iterator();
    while( it.hasNext() ) {
      System.out.println(it.next().toString());
    }
  }

Στο παραπάνω παράδειγμα οι δύο μέθοδοι iterateList() είναι ισοδύναμες. Το πλεονέκτημα του iterator είναι ότι σας επιτρέπει να διαγράφετε εγγραφές καθώς διατρέχετε τη συλλογή. Συγκεκριμένα, μπορείτε να διαγράφετε εγγραφές μέσω της μεθόδου remove(). Για παράδειγμα, η παρακάτω μέθοδος διαγράφει όλα τα δεδομένα της συλλογής:

<code java>
  public void clearCollection() {  
    Iterator<Student> it = students.iterator();
    while( it.hasNext() ) {
      it.remove();
    }
  }

Βασικές μέθοδοι

  • 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 {
 
  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");
    }
 
  }
}

Στην συνέχεια βάλτε σχόλια στην γραμμή που υποδεικνύουν τα σχόλια και αφαιρέστε το τμήμα του κώδικα που είναι σε σχόλια. Μεταγλωττίστε και τρέξτε. Ποιό είναι το αποτέλεσμα αυτή την φορά; Γιατί συμβαίνει αυτό;

Όταν συγκρίνονται δύο Collections ως προς τα περιεχόμενα τους συγκρίνουμε εάν το πρώτο περιέχει τα ίδια στοιχεία με το δεύτερο, δηλαδή τα ίδια αντικείμενα. Εάν δημιουργηθούν αντίγραφα των αντικειμένων της μίας και τοποθετηθούν στην 2η η σύγκριση των περιεχομένων δεν επιστρέφει ισότητα.

* addAll(Collection<?> c) - Προσθέτει όλες τις εγγραφές που περιέχονται στο Collection c.

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();    
  }
} 
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();
 
  }
} 

Και εδώ ισχύει ότι αναφέραμε παραπάνω αναφορικά με την σύγκριση των Collections. Eάν η συλλογή sts δημιουργηθεί από αντίγραφα των αντικειμένων της συλλογής stl, η μέθοδος removeAll δεν θα αφαιρέσει κανένα στοιχείο. Αφαίρεση αντικειμένων θα γίνει μόνο για αντικείμενα που ανήκουν ταυτόχρονα στις συλλογές stl και sts.

java/jfc_intf_collection.txt · Last modified: 2017/02/17 16:29 by gthanos