Interfata Set
Interfata Set modeleaza notiunea de multime in sens matematic. O structura de date de tip multime nu permite elemente duplicate.
public interface Set extends Collection { | |
int size(); | |
boolean isEmpty(); | |
boolean contains(Object o); | |
Iterator<E> iterator(); | |
Object[] toArray(); | |
<T> T[] toArray(T[] a); | |
boolean add(E e); | |
boolean remove(Object o); | |
boolean containsAll(Collection<?> c); | |
boolean addAll(Collection<? extends E> c); | |
boolean retainAll(Collection<?> c); | |
boolean removeAll(Collection<?> c); | |
void clear(); | |
boolean equals(Object o); | |
int hashCode(); | |
} |
Interfata Set declara doar metodele mostenite din interfata Collection.
Metoda | Semnificatie |
---|---|
int size() | returneaza numarul de elemente din multime |
boolean isEmpty() | returneaza true daca multimeanu contine nici un element |
boolean contains(Object o) | verifica daca in multime se gaseste obiectul transmis |
Iterator iterator() | returneaza un iterator prin intermediul caruia poate fi parcursa multimea |
Object toArray() | returneaza un tablou care contine elementele multimii |
boolean add(E e) | adauga la multime elementul transmis |
boolean remove(Object o) | sterge din multime obiectul transmis |
boolean containsAll(Collection<?> c) | verifica daca in multime este inclusa colectia transmisa |
boolean addAll(Collection<? extends E> c) | adauga la multime toate elementele colectiei transmise |
boolean removeAll(Collection<?> c) | sterge din multime toate elementele colectiei transmise |
boolean retainAll(Collection<?> c) | pastreaza in multime doar elementele colecției transmise |
void clear() | sterge toate obiectele multimii |
Operatiile specifice multimilor sunt implementate prin intermediul metodelor addAll(), retainAll(), respectiv removeAll():
• reuniune: set1.addAll(set2);
• intersectie: set1.retainAll(set2);
• diferenta: set1.removeAll(set2).
Implementari standard
Pentru interfata Set sunt disponibile si urmatoarele doua implementari standard:
• HashSet: este utilizata pentru o implementare rapida, care nu stabileste o ordonare a elementelor; elementele sunt memorate intr-o tabela de dispersie (hash table);
package ro.virtualcampus.set; | |
import java.util.HashSet; | |
public class AppHashSet { | |
public static void main(String[] args) { | |
HashSet<String> multime1 = new HashSet<String>(); | |
multime1.add("Iulian"); | |
multime1.add("Corina"); | |
multime1.add("Ghita"); | |
multime1.add("Silviu"); | |
System.out.printf("multime nume %s %n", multime1); | |
for (String element : multime1) { | |
System.out.printf("%s, ", element); | |
} | |
System.out.printf("%n"); | |
HashSet<String> multime2 = new HashSet<String>(); | |
multime2.add("Maria"); | |
multime2.add("Ghita"); | |
multime2.add("Irina"); | |
multime1.addAll(multime2); | |
System.out.printf("multime nume %s %n", multime1); | |
multime1.removeAll(multime2); | |
System.out.printf("multime nume %s %n", multime1); | |
multime1.retainAll(multime2); | |
System.out.printf("multime nume %s %n", multime1); | |
} | |
} |
multime nume [Corina, Silviu, Iulian, Ghita] Corina, Silviu, Iulian, Ghita, multime nume [Corina, Silviu, Iulian, Irina, Ghita, Maria] multime nume [Corina, Silviu, Iulian] multime nume []
• TreeSet: ofera acces ordonat la elementele multimii, acestea fiind ordonate ascendent pe baza valorilor; elementele sunt memorate sub forma unui arbore binar; implementarea este mai lenta decat in cazul lui HashSet.
package ro.virtualcampus.set; | |
import java.util.ArrayList; | |
import java.util.Arrays; | |
import java.util.HashSet; | |
import java.util.List; | |
import java.util.TreeSet; | |
public class AppTreeSet { | |
public static void main(String[] args) { | |
HashSet<String> multime1 = new HashSet<String>(); | |
multime1.add("Iulian"); | |
multime1.add("Corina"); | |
multime1.add("Ghita"); | |
multime1.add("Silviu"); | |
System.out.printf("multime nume %s %n", multime1); | |
TreeSet<String> multime2 = new TreeSet<String>(multime1); | |
System.out.printf("multime nume dupa ordonare %s %n", multime2); | |
System.out.printf("numarul de elemente din multimea %s este %d %n", | |
multime2, multime2.size()); | |
System.out.printf("numele %s este prezent in multimea %s: %b %n", | |
"Iulian", multime2, multime2.contains("Iulian")); | |
System.out.printf("multime nume ordonata descrescator %s %n", | |
new TreeSet<String>(multime1).descendingSet()); | |
List<String> lista = new ArrayList<String>(multime2); | |
System.out.printf("lista nume %s obtinute dupa conversia multimii %s %n", | |
lista, multime2); | |
Object[] tablou1 = multime2.toArray(); | |
System.out.printf("tablou nume %s obtinut din multimea %s %n", | |
Arrays.toString(tablou1), multime2); | |
Object[] tablou2 = lista.toArray(); | |
System.out.printf("tablou nume %s obtinut din lista %s %n", | |
Arrays.toString(tablou2), lista); | |
} | |
} |
multime nume [Corina, Silviu, Iulian, Ghita] multime nume dupa ordonare [Corina, Ghita, Iulian, Silviu] numarul de elemente din multimea [Corina, Ghita, Iulian, Silviu] este 4 numele Iulian este prezent in multimea [Corina, Ghita, Iulian, Silviu]: true multime nume ordonata descrescator [Silviu, Iulian, Ghita, Corina] lista nume [Corina, Ghita, Iulian, Silviu] obtinute dupa conversia multimii [Corina, Ghita, Iulian, Silviu] tablou nume [Corina, Ghita, Iulian, Silviu] obtinut din multimea [Corina, Ghita, Iulian, Silviu] tablou nume [Corina, Ghita, Iulian, Silviu] obtinut din lista [Corina, Ghita, Iulian, Silviu]
Parcurgerea multimilor
Parcurgerea elementelor unei multimi poate fi realizata cu ajutorul constructiei for-each si prin intermediul iteratorilor.
Constructia for-each permite parcurgerea rapida a elementelor unei multimi cu ajutorul unei iteratii de tip for. Urmatoarea secventa de cod utilizeaza o constructie for-each pentru a afisa elementele unei multimi.
package ro.virtualcampus.set; | |
import java.util.Arrays; | |
import java.util.HashSet; | |
import java.util.Set; | |
public class AppSetForEach { | |
public static void main(String args[]) { | |
String nume[] = {"Ioana", "Ghita", "Maria"}; | |
Set<String> multime = new HashSet<String>(Arrays.asList(nume)); | |
for (String element : multime) | |
System.out.println(element); | |
} | |
} |
Ioana Ghita Maria
Iteratorii reprezinta structuri de date suplimentare care permit parcurgerea elementelor unei multimi. Iteratorii sunt obiecte care pot realiza traversarea in ordine a unei multimi la care sunt atasati. Ordinea de parcurgere a elementelor este determinata de modul in care acestea sunt retinute in interiorul multimii.
Declararea unui iterator se realizeaza prin urmatoarea sintaxa:
Iterator<E> iteratorMultime = multime.iterator();
Interfata Iterator prezinta urmatoarea structura:
public interface Iterator { | |
boolean hasNext(); | |
E next(); | |
void remove(); | |
} |
Metoda | Semnificatie |
---|---|
boolena hasNext() | returneaza true daca mai exista elemente neparcurse inca prin intermediul iteratorului |
E next() | returneaza urmatorul element din colectie |
void remove() | elimina din colectie ultimul element returnat de metoda next() |
Aplicatia urmatoare are in vedere definirea unui tip de date catalog (CatalogSet), care permite gestionarea studentilor unei facultati prin intermediul unei multimi. Clasele Facultate si Student sunt definite la urmatoarea adresa Clase abstracte si interfete Java.
package ro.virtualcampus.app; | |
import java.util.Iterator; | |
import ro.virtualcampus.person.Student; | |
import ro.virtualcampus.unit.Facultate; | |
import ro.virtualcampus.set.CatalogSet; | |
public class AppSet { | |
public static void main(String[] args) { | |
Facultate etti = new Facultate("ETTI", "Vasile Parvan nr. 2"); | |
CatalogSet tst3 = new CatalogSet("3 TST"); | |
CatalogSet ea3 = new CatalogSet("3 EA"); | |
Student s1; | |
tst3.getStudenti().add(s1 = new Student("Irina Popescu", 22, etti, 3)); | |
tst3.getStudenti().add(new Student("Vlad Bucur", 23, etti, 3)); | |
ea3.getStudenti().add(new Student("Mihai Voda", 25, etti, 4)); | |
ea3.getStudenti().add(new Student("Bogdan Cornu", 24, etti, 4)); | |
tst3.transferStudenti(ea3.getStudenti()); | |
ea3.getStudenti().clear(); | |
tst3.afisareStudenti(); | |
if (tst3.getStudenti().remove(s1)) | |
System.out.println("studentul " + s1.getNume() + " a fost exmatriculat"); | |
else | |
System.out.println("studentul " + s1.getNume() + " nu poate fi exmatriculat"); | |
System.out.println("parcurgere studenti folosind for-each"); | |
for (Student student : tst3.getStudenti()) | |
System.out.println(student); | |
System.out.println("parcurgere studenti folosind iterator"); | |
Iterator<Student> i = tst3.getStudenti().iterator(); | |
while (i.hasNext()) | |
System.out.println(i.next()); | |
System.out.println("parcurgere studenti de la nivelul tabloului"); | |
Object[] studenti = tst3.getStudenti().toArray(); | |
for (Object student : studenti) | |
System.out.println(student); | |
if (!tst3.getStudenti().isEmpty()) | |
System.out.println("nu se recomanda desfintarea anului de studiu " + | |
tst3.getAnStudiu()); | |
tst3.getStudenti().clear(); | |
tst3.afisareStudenti(); | |
} | |
} |
anul de studiu 3 TST are 4 studenti [Student [facultate=Facultate [nume=ETTI, adresa=Vasile Parvan nr. 2], anStudiu=3, nume=Irina Popescu, varsta=22], Student [facultate=Facultate [nume=ETTI, adresa=Vasile Parvan nr. 2], anStudiu=4, nume=Mihai Voda, varsta=25], Student [facultate=Facultate [nume=ETTI, adresa=Vasile Parvan nr. 2], anStudiu=3, nume=Vlad Bucur, varsta=23], Student [facultate=Facultate [nume=ETTI, adresa=Vasile Parvan nr. 2], anStudiu=4, nume=Bogdan Cornu, varsta=24]] studentul Irina Popescu a fost exmatriculat parcurgere studenti folosind for-each Student [facultate=Facultate [nume=ETTI, adresa=Vasile Parvan nr. 2], anStudiu=4, nume=Mihai Voda, varsta=25] Student [facultate=Facultate [nume=ETTI, adresa=Vasile Parvan nr. 2], anStudiu=3, nume=Vlad Bucur, varsta=23] Student [facultate=Facultate [nume=ETTI, adresa=Vasile Parvan nr. 2], anStudiu=4, nume=Bogdan Cornu, varsta=24] parcurgere studenti folosind iterator Student [facultate=Facultate [nume=ETTI, adresa=Vasile Parvan nr. 2], anStudiu=4, nume=Mihai Voda, varsta=25] Student [facultate=Facultate [nume=ETTI, adresa=Vasile Parvan nr. 2], anStudiu=3, nume=Vlad Bucur, varsta=23] Student [facultate=Facultate [nume=ETTI, adresa=Vasile Parvan nr. 2], anStudiu=4, nume=Bogdan Cornu, varsta=24] parcurgere studenti de la nivelul tabloului Student [facultate=Facultate [nume=ETTI, adresa=Vasile Parvan nr. 2], anStudiu=4, nume=Mihai Voda, varsta=25] Student [facultate=Facultate [nume=ETTI, adresa=Vasile Parvan nr. 2], anStudiu=3, nume=Vlad Bucur, varsta=23] Student [facultate=Facultate [nume=ETTI, adresa=Vasile Parvan nr. 2], anStudiu=4, nume=Bogdan Cornu, varsta=24] nu se recomanda desfintarea anului de studiu 3 TST anul de studiu 3 TST are 0 studenti []