User Tools

Site Tools


java:jfc_intf_collection

This is an old revision of the document!


Interface java.util.Collection

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

Διάτρεξη ενός 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 με την παρακάτω υλοποίηση

  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:FALSE παρά το γεγονός ότι η δεύτερη λίστα περιέχει δύο αντικείμενα τύπου Student τα οποία έχουν τα ίδια πεδία με αντικείμενα που περιέχονται στο Collection students. O λόγος που η συνάρτηση containsAll επιστρέφει false είναι ότι πρόκειται για διαφορετικά αντικείμενα, δηλαδή για αντικείμενα με διαφορετική τιμή επιστροφής της συνάρτησης hashCode().

O τρόπος για να λύσουμε το συγκεκριμένο πρόβλημα είναι να ορίσουμε τις συναρτήσεις hashCode και equals για την κλάση Student (ορίζονται στην κλάση Object), όπως παρακάτω:

  public boolean equals(Object o) {
    return (o instanceof Student && o.hashCode() == this.hashCode());
  }
 
  public int hashCode() {
      return firstName.hashCode() + 2 * lastName.hashCode();
  }

Απαραίτητη προϋπόθεση για να δουλεύει σωστά η συνάρτηση equals είναι δύο ίδια αντικείμενα να διαθέτουν την ίδια τιμή επιστροφής της συνάρτησης hashCode.

Θέλουμε η συνάρτηση hashCode για δύο αντικείμενα στα οποία έχουμε αντιμεταθέσει τα πεδία firstName, lastName να επιστρέφει διαφορετικές τιμές .

* 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 δεν θα αφαιρέσει τίποτα.

java/jfc_intf_collection.1583851310.txt.gz · Last modified: 2020/03/10 14:41 by gthanos