Ένα Set είναι μια συλλογή χωρίς σειρά που, σε αντίθεση με τη List, είναι εγγυημένο ότι δεν περιέχει διπλότυπες τιμές.
Η παράμετρος γενικού τύπου της διεπαφής Set δηλώνει τον τύπο των στοιχείων που περιέχει το Set:
Set<Integer> ints = Set.of(1, 2, 3);
Set<String> strings = Set.of("alpha", "beta", "gamma");
Set<Object> mixed = Set.of(1, false, "foo");
Σημείωσε ότι η μέθοδος Set.of() δημιουργεί ένα μη τροποποιήσιμο στιγμιότυπο Set.
Αν προσπαθήσεις να καλέσεις μεθόδους όπως add και remove σε αυτό το στιγμιότυπο, θα προκληθεί εξαίρεση κατά την εκτέλεση.
Για να φτιάξεις ένα τροποποιήσιμο Set, χρειάζεται να δημιουργήσεις στιγμιότυπο μιας κλάσης που υλοποιεί τη διεπαφή Set.
Η πιο συχνά χρησιμοποιούμενη ενσωματωμένη κλάση που υλοποιεί αυτή τη διεπαφή είναι η κλάση HashSet.
Set<Integer> ints = new HashSet<>();
Η διεπαφή Set επεκτείνει τις διεπαφές Collection και Iterable, και επομένως μοιράζεται πολλές μεθόδους με άλλους τύπους συλλογών.
Μια αξιοσημείωτη διαφορά, ωστόσο, από τη διεπαφή Collection είναι ότι μέθοδοι όπως add και remove επιστρέφουν ένα boolean (αντί για void) που δηλώνει αν το στοιχείο υπήρχε στο σύνολο όταν κλήθηκε η μέθοδος:
Set<Integer> set = new HashSet<>();
set.add(1);
// => true
set.add(2);
// => true
set.add(1);
// => false
set.size();
// => 2
set.contains(1);
// => true
set.contains(3);
// => false
set.remove(3);
// => false
set.remove(2);
// => true
set.size();
// => 1
Η νοσταλγία σου για τις κάρτες Blorkemon™️ δε δείχνει σημάδια ύφεσης, άρχισες μάλιστα να τις συλλέγεις ξανά και βάζεις και τους φίλους σου να σε ακολουθήσουν.
Σε αυτή την άσκηση, θα χρησιμοποιήσεις το interface Set για να σε βοηθήσει να διαχειριστείς τη συλλογή σου, αφού οι διπλότυπες κάρτες δεν έχουν σημασία όταν ο στόχος σου είναι να αποκτήσεις όλες τις υπάρχουσες κάρτες.
Μόλις βρήκες το παλιό σου απόθεμα από κάρτες Blorkemon™️! Το απόθεμα περιέχει ένα σωρό διπλότυπες κάρτες, οπότε ήρθε η ώρα να ξεκινήσεις μια νέα συλλογή αφαιρώντας τα διπλότυπα.
Θέλεις πραγματικά οι φίλοι σου να μπουν στην τρέλα σου με τα Blorkemon™️, και ο καλύτερος τρόπος είναι να τους ξεκινήσεις τη συλλογή χαρίζοντάς τους μία κάρτα.
Υλοποίησε τη μέθοδο newCollection, η οποία μετατρέπει μια λίστα από κάρτες σε ένα Set που αντιπροσωπεύει τη νέα σου συλλογή.
GottaSnatchEmAll.newCollection(List.of("Newthree", "Newthree", "Newthree"));
// => {"Newthree"}
Μόλις αποκτήσεις μια συλλογή, αυτή αποκτά δική της ζωή και πρέπει να μεγαλώσει.
Υλοποίησε τη μέθοδο addCard, η οποία παίρνει μια νέα κάρτα και το τρέχον σύνολο των συλλεγμένων καρτών σου.
Η μέθοδος θα πρέπει να προσθέτει τη νέα κάρτα στη συλλογή αν δεν υπάρχει ήδη και να επιστρέφει ένα boolean που δείχνει αν η συλλογή ενημερώθηκε.
Set<String> collection = GottaSnatchEmAll.newCollection("Newthree");
GottaSnatchEmAll.addCard("Scientuna",collection);
// => true
collection.contains("Scientuna");
// => true
Θέλεις πραγματικά οι φίλοι σου να μπουν στην τρέλα σου με τα Blorkemon™️, οπότε ήρθε η ώρα να ξεκινήσεις τις ανταλλαγές!
Όταν κάνεις ανταλλαγές με φίλους, δεν αξίζει κάθε ανταλλαγή, ούτε είναι πάντα εφικτή. Θα πρέπει να κάνεις ανταλλαγή μόνο αν τόσο εσύ όσο και ο φίλος σου έχετε μια κάρτα που ο άλλος δεν έχει.
Υλοποίησε τη μέθοδο canTrade, η οποία παίρνει την τρέχουσα συλλογή σου και τη συλλογή ενός από τους φίλους σου.
Θα πρέπει να επιστρέφει ένα boolean που δείχνει αν μια ανταλλαγή είναι εφικτή, σύμφωνα με τους παραπάνω κανόνες.
Set<String> myCollection = Set.of("Newthree");
Set<String> theirCollection = Set.of("Scientuna");
GottaSnatchEmAll.canTrade(myCollection, theirCollection);
// => true
Εσύ και οι φίλοι σου που τρελαίνεστε με τα Blorkemon™️ μαζεύεστε και αναρωτιέστε ποιες κάρτες είναι οι πιο κοινές.
Υλοποίησε τη μέθοδο commonCards, η οποία παίρνει μια λίστα από συλλογές και επιστρέφει μια συλλογή με τις κάρτες που έχουν όλες οι συλλογές.
GottaSnatchEmAll.commonCards(List.of(Set.of("Scientuna"), Set.of("Newthree","Scientuna")));
// => {"Scientuna"}
Έχετε εσύ και οι φίλοι σου συνολικά όλες τις κάρτες Blorkemon™️;
Υλοποίησε τη μέθοδο allCards, η οποία παίρνει μια λίστα από συλλογές και επιστρέφει μια συλλογή με όλες τις διαφορετικές κάρτες από όλες τις συλλογές μαζί.
GottaSnatchEmAll.allCards(List.of(Set.of("Scientuna"), Set.of("Newthree","Scientuna")));
// => {"Newthree", "Scientuna"}
Γράψου στο Exercism για να μάθεις και να κατακτήσεις Java με 26 έννοιες158 ασκήσεις και πραγματική καθοδήγηση από ανθρώπους, όλα δωρεάν.