User Tools

Site Tools


java:jfc_intf_set

This is an old revision of the document!


Interface java.util.Set και java.util.SortedSet

Το Set είναι ένα Collection το οποίο δεν επιτρέπει διπλές εγγραφές. Συνήθως υλοποιείται μέσω hash table ή ισοζυγισμένου δυαδικού δέντρου αναζητήσεως. Δείτε το παρακάτω παράδειγμα κώδικα που εξηγεί την λειτουργία του Set.

FindDups2.java
import java.util.*;
 
public class FindDups {
 
  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"));
    students.add(new Student("John", "Smith"));
    students.add(new Student("Stanley", "Peters"));
 
    Collection <Student> uniques = new HashSet<Student>();
    Collection <Student> dups = new HashSet<Student>();
 
    for(Student st : students) {
      if(uniques.contains(st))
        dups.add(st);
      else
        uniques.add(st);
    }
 
    uniques.removeAll(dups);
    System.out.println("-- Uniques --");
    print(uniques);
    System.out.println("-- Dups --");
    print(dups);
  }
 
  public static void print(Collection<Student> collection) {
    Iterator<Student> it = collection.iterator();
    while(it.hasNext())
      System.out.println(it.next());
  }
}

Εκτός από το interface java.util.Set είναι διαθέσιμο και το java.util.SortedSet το οποίο είναι απόγονος του java.util.Set και αποθηκεύει τα στοιχεία ταξινομημένα σε αύξουσα σειρά.

Υλοποιήσεις

Βασικές υλοποιήσεις του Set interface είναι οι παρακάτω:

  • HashSet: Υλοποιεί το Set μέσα από ένα HashTable. Γρήγορο στην αναζήτηση. Δεν εγγυάται ότι η σειρά διάτρεξης είναι η σειρά με την οποία εισάγαμε τα δεδομένα. Απαιτεί κατά κανόνα περισσότερο χώρο αποθήκευσης από τον στοιχεία που περιέχει το Set. Προκειμένου να είμαστε σε θέση να εντοπίσουμε διπλές εγγραφές η παράμετρος κλάση του HashSet θα πρέπει να υλοποιεί τις μεθόδους public boolean equals(Object obj) και public int hashCode() της κλάσης java.lang.Object.
  • TreeSet: Υλοποιεί το Set μέσα από ένα Red-Black tree. Ικανοποιητικά γρήγορο. Δεν εγγυάται ότι η σειρά διάτρεξης είναι η σειρά με την οποία εισάγαμε τα δεδομένα. Η σειρά διάτρεξης είναι η σειρά κατάταξης των στοιχείων, διότι υλοποιεί και το interface SortedSet. Προκειμένου να είμαστε σε θέση να εντοπίσουμε διπλές εγγραφές η παράμετρος κλάση του HashSet θα πρέπει να υλοποιεί το interface java.lang.Comparable.
  • LinkedHashSet: Υλοποιεί το Set μέσα από ένα HashTable με παράλληλη χρήση διπλά συνδεδεμένης λίστας. Γρήγορο στην αναζήτηση. Εγγυάται ότι η σειρά διάτρεξης είναι η σειρά με την οποία εισάγαμε τα δεδομένα, λόγω της ύπαρξης της λίστας. Απαιτεί κατά κανόνα περισσότερο χώρο αποθήκευσης από τον στοιχεία που περιέχει το Set. Προκειμένου να είμαστε σε θέση να εντοπίσουμε διπλές εγγραφές ισχύει η απαίτηση υλοποίησης των μεθόδων public boolean equals(Object obj) και public int hashCode() της κλάσης java.lang.Object.
java/jfc_intf_set.1584035126.txt.gz · Last modified: 2020/03/12 17:45 by gthanos