User Tools

Site Tools


java:jfc_intf_collection

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
java:jfc_intf_collection [2020/03/10 14:31] – [Εργασίες με πολλαπλές εγγραφές] gthanosjava:jfc_intf_collection [Unknown date] (current) – external edit (Unknown date) 127.0.0.1
Line 5: Line 5:
 ===== Διάτρεξη ενός Collection ===== ===== Διάτρεξη ενός Collection =====
  
-==== 1ος τρόπος - for() ====+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 ====
  
 <code java StudentCollection.java> <code java StudentCollection.java>
Line 12: Line 16:
  
 public class StudentCollection { public class StudentCollection {
- 
-  private Collection<Student> students; 
      
-  public StudentCollection() { +  public static void iterateCollection(Collection<Student> students) {   
-    students = new LinkedList<Student>(); +    for(Student st: students{ 
-    populateList();+      System.out.println(st.toString()); 
 +    }
   }   }
      
-  public final void populateList() {+  public static void main(String args[]) { 
 +    Collection<Student> students; 
 +    students = new LinkedList<Student>();
     students.add(new Student("John", "Smith"));     students.add(new Student("John", "Smith"));
     students.add(new Student("Stanley", "Peters"));     students.add(new Student("Stanley", "Peters"));
Line 26: Line 31:
     students.add(new Student("Suzan", "Miles"));     students.add(new Student("Suzan", "Miles"));
     students.add(new Student("Mary", "Poppins"));     students.add(new Student("Mary", "Poppins"));
-  } +    iterateCollection(students);
-   +
-  public void iterateList() {   +
-    for(Student st: students) { +
-      System.out.println(st.toString()); +
-    } +
-  } +
-   +
-  public static void main(String args[]) { +
-    StudentCollection stl = new StudentCollection(); +
-    stl.iterateList();+
   }   }
  
Line 43: Line 38:
 ==== 2ος τρόπος - iterator ==== ==== 2ος τρόπος - iterator ====
  
-Μπορείτε να αντικαταστήσετε την ''iterateList'' με την παρακάτω υλοποίηση+Μπορείτε να αντικαταστήσετε την ''iterateCollection'' με την παρακάτω υλοποίηση
 <code java> <code java>
-  public void iterateList() {  +  public static void iterateCollection(Collection<Student> students) {  
     Iterator<Student> it = students.iterator();     Iterator<Student> it = students.iterator();
     while( it.hasNext() ) {     while( it.hasNext() ) {
Line 99: Line 94:
 </code> </code>
  
-Εάν μεταγλωττίσετε και εκτελέσετε το παραπάνω πρόγραμμα θα δείτε ότι εκτυπώνει το μήνυμα ''containsAll:FALSE'' παρά το γεγονός ότι η δεύτερη λίστα περιέχει δύο αντικείμενα τύπου Student τα οποία έχουν τα ίδια πεδία με αντικείμενα που περιέχονται στο Collection students. O λόγος που η συνάρτηση ''containsAll'' επιστρέφει false είναι ότι πρόκειται για διαφορετικά αντικείμενα, δηλαδή για αντικείμενα με διαφορετική τιμή επιστροφής της συνάρτησης hashCode(). +<WRAP tip center 80% round > 
- +Απαραίτητη προϋπόθεση για να δουλέψει σωστά η μέθοδος ''containsAll'' είναι η παράμετρος κλάση του Collection να υλοποιεί τις μεθόδους ''equals'' και ''hashCode''. Εάν αφαιρέσετε έστω και μία από τις μεθόδους αυτές από την υλοποίηση της κλάσης Student θα παρατηρήσετε ότι η μέθοδος ''containsAll'' δεν αναγνωρίζει τα αντικείμενα της μεταβλητής ''sts'' ως αντίγραφα εκείνων που περιέχονται στην αρχική λίστα φοιτητών ''students''.
-O τρόπος για να λύσουμε το συγκεκριμένο πρόβλημα είναι να ορίσουμε ξανά τις συναρτήσεις [[https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html#hashCode--|hashCode]] και [[https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html#equals-java.lang.Object-|equals]] της κλάσης [[https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html|java.lang.Object]]. +
- +
-<WRAP important center 80% round > +
-Απαραίτητη προϋπόθεση για να δουλεύει σωστά η συνάρτηση ''equals'' είναι δύο αντικείμενα που διαθέτουν τα ίδια πεδία να διαθέτουν και την ίδια τιμή επιστροφής της συνάρτηση ''hashCode''.+
 </WRAP> </WRAP>
  
Line 111: Line 102:
 <code java StudentCollection.java> <code java StudentCollection.java>
 import java.util.*; import java.util.*;
-import java.lang.*; 
-import java.util.*; 
-import java.lang.*; 
  
 public class StudentCollection { public class StudentCollection {
- +    
-  private Collection<Student> students; +  public static void main(String args[]) { 
-   +    Collection<Student> students = new ArrayList<>();
-  public StudentCollection() { +
-    students = new LinkedList<Student>(); +
-    populateList(); +
-  } +
-   +
-  public final void populateList() {+
     students.add(new Student("John", "Smith"));     students.add(new Student("John", "Smith"));
     students.add(new Student("Stanley", "Peters"));     students.add(new Student("Stanley", "Peters"));
Line 130: Line 112:
     students.add(new Student("Suzan", "Miles"));     students.add(new Student("Suzan", "Miles"));
     students.add(new Student("Mary", "Poppins"));     students.add(new Student("Mary", "Poppins"));
-  } +         
-   +    Collection <Student> sts = new LinkedList<Student>(); 
-  public Collection<Student> getStudents() { +    sts.add(new Student("John", "Smith"))
-    return students+    sts.add(new Student("Stanley", "Peters"));
-  }+
    
-  public void iterateList() {   +    students.addAll(sts); 
-    for(Student st: students) { +    print(students); 
-      System.out.println(st.toString()); +    
-    }+
   }   }
      
-  public static void main(String args[]) { +  public static void print(Collection<Student> collection) { 
-    StudentCollection stl = new StudentCollection();     +    Iterator<Student> it collection.iterator(); 
-    Collection <Student> sts new LinkedList<Student>(); +    while(it.hasNext()) 
-    sts.add(new Student("Lena", "Travolta")); +      System.out.println(it.next());
-    sts.add(new Student("George", "Thanos")); +
-     +
-    stl.getStudents().addAll(sts); +
-    stl.iterateList();    +
   }   }
-+}
 </code> </code>
 +
 +<WRAP todo center 80% round >
 +Στον παραπάνω κώδικα αντικαταστήστε την πρώτη γραμμή της ''main'' με
 +<code>
 +Collection<Student> students = new HashSet<>();
 +</code>
 +
 +Τι παρατηρείτε; Γιατί συμβαίνει αυτό;
 +</WRAP>
  
   * **[[https://docs.oracle.com/javase/7/docs/api/java/util/Collection.html#removeAll(java.util.Collection)|removeAll(Collection<?> c)]]** - Αφαιρεί όλες τις εγγραφές που περιέχονται στο Collection ''c''.   * **[[https://docs.oracle.com/javase/7/docs/api/java/util/Collection.html#removeAll(java.util.Collection)|removeAll(Collection<?> c)]]** - Αφαιρεί όλες τις εγγραφές που περιέχονται στο Collection ''c''.
 <code java StudentCollection.java> <code java StudentCollection.java>
 import java.util.*; import java.util.*;
-import java.lang.*; 
- 
-import java.util.*; 
-import java.lang.*; 
  
 public class StudentCollection { public class StudentCollection {
- +    
-  private Collection<Student> students; +  public static void main(String args[]) { 
-   +    Collection<Student> students = new ArrayList<>();
-  public StudentCollection() { +
-    students = new LinkedList<Student>(); +
-    populateList(); +
-  } +
-   +
-  public final void populateList() {+
     students.add(new Student("John", "Smith"));     students.add(new Student("John", "Smith"));
     students.add(new Student("Stanley", "Peters"));     students.add(new Student("Stanley", "Peters"));
Line 177: Line 152:
     students.add(new Student("Suzan", "Miles"));     students.add(new Student("Suzan", "Miles"));
     students.add(new Student("Mary", "Poppins"));     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>();     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("John", "Smith"));
     sts.add(new Student("Stanley", "Peters"));     sts.add(new Student("Stanley", "Peters"));
-    */ +  
-     +    students.addAll(sts)
-    stl.getStudents().removeAll(sts); +    students.removeAll(sts); 
-    stl.iterateList();+    print(students);
          
   }   }
-+   
 +  public static void print(Collection<Student> collection) { 
 +    Iterator<Student> it = collection.iterator(); 
 +    while(it.hasNext()) 
 +      System.out.println(it.next()); 
 +  } 
 +}
 </code> </code>
  
-<WRAP center 70% round tip> +Παρατηρήστε ότι η μέθοδος ''removeAll'' αφαιρεί το σύνολο των εγγραφών ακόμη και εάν μία εγγραφή εμφανίζεται περισσότερες από μία φορές.
-Και εδώ ισχύει ότι αναφέραμε παραπάνω αναφορικά με την σύγκριση των //Collections//. Eάν η λίστα //sts// δημιουργηθεί από αντίγραφα των αντικειμένων της λίστας //stl//, η μέθοδος //removeAll// δεν θα αφαιρέσει τίποτα. +
-</WRAP>+
  
 |Προηγούμενο: [[:java:jfc_interfaces | JCF Interfaces ]] | [[:toc | Περιεχόμενα ]] | Επόμενο: [[:java:jfc_intf_set | Interface java.util.Set ]] | |Προηγούμενο: [[:java:jfc_interfaces | JCF Interfaces ]] | [[:toc | Περιεχόμενα ]] | Επόμενο: [[:java:jfc_intf_set | Interface java.util.Set ]] |
  
java/jfc_intf_collection.1583850660.txt.gz · Last modified: 2020/03/10 14:31 by gthanos