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:54] – [Εργασίες με πολλαπλές εγγραφές] 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 98: Line 93:
 } }
 </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() == this.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>
  
java/jfc_intf_collection.1583852079.txt.gz · Last modified: 2020/03/10 14:54 (external edit)