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 revision Previous revision
Next revision
Previous revision
Next revision Both sides next revision
java:jfc_intf_collection [2020/03/10 14:39]
gthanos [Εργασίες με πολλαπλές εγγραφές]
java:jfc_intf_collection [2021/05/22 03:40]
gthanos [2ος τρόπος - iterator]
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[]) { 
 +    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 30:
     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 37:
 ==== 2ος τρόπος - iterator ==== ==== 2ος τρόπος - iterator ====
  
-Μπορείτε να αντικαταστήσετε την ''iterateList'' με την παρακάτω υλοποίηση+Μπορείτε να αντικαταστήσετε την ''iterateCollection'' με την παρακάτω υλοποίηση
 <code java> <code java>
-  public void iterateList() {  +  public void iterateCollection(Collection<Student> students) {  
     Iterator<Student> it = students.iterator();     Iterator<Student> it = students.iterator();
     while( it.hasNext() ) {     while( it.hasNext() ) {
Line 98: Line 92:
 } }
 </code> </code>
- 
-Εάν μεταγλωττίσετε και εκτελέσετε το παραπάνω πρόγραμμα θα δείτε ότι εκτυπώνει το μήνυμα ''containsAll:FALSE'' παρά το γεγονός ότι η δεύτερη λίστα περιέχει δύο αντικείμενα τύπου Student τα οποία έχουν τα ίδια πεδία με αντικείμενα που περιέχονται στο Collection students. O λόγος που η συνάρτηση ''containsAll'' επιστρέφει false είναι ότι πρόκειται για διαφορετικά αντικείμενα, δηλαδή για αντικείμενα με διαφορετική τιμή επιστροφής της συνάρτησης hashCode(). 
- 
-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]] για την κλάση Student (ορίζονται στην κλάση [[https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html|Object]]), όπως παρακάτω: 
- 
-<code java> 
-  public boolean equals(Object o) { 
-    return (o instanceOf Student && o.hashCode() == hashCode); 
-  } 
-   
-  public int hashCode() { 
-      return firstName.hashCode() + 2 * lastName.hashCode(); 
-  } 
-</code> 
- 
-<WRAP important center 80% round > 
-Απαραίτητη προϋπόθεση για να δουλεύει σωστά η συνάρτηση ''equals'' είναι δύο ίδια αντικείμενα να διαθέτουν την ίδια τιμή επιστροφής της συνάρτησης ''hashCode''. 
-</WRAP> 
  
 <WRAP tip center 80% round > <WRAP tip center 80% round >
-Θέλουμε η συνάρτηση ''hashCode'' για δύο αντικείμενα στα οποία έχουμε αντιμεταθέσει τα πεδία firstName, lastName να επιστρέφει διαφορετικές τιμές .+Απαραίτητη προϋπόθεση για να δουλέψει σωστά η μέθοδος ''containsAll'' είναι η παράμετρος κλάση του Collection να υλοποιεί τις μεθόδους ''equals'' και ''hashCode''. Εάν αφαιρέσετε έστω και μία από τις μεθόδους αυτές από την υλοποίηση της κλάσης Student θα παρατηρήσετε ότι η μέθοδος ''containsAll'' δεν αναγνωρίζει τα αντικείμενα της μεταβλητής ''sts'' ως αντίγραφα εκείνων που περιέχονται στην αρχική λίστα φοιτητών ''students''.
 </WRAP> </WRAP>
  
Line 125: Line 101:
 <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 144: Line 111:
     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 191: Line 151:
     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.txt · Last modified: 2021/05/22 02:47 (external edit)