Colectii

Conceptul de colectie

Colectia este o acumulare de obiecte, numite elemente. Numarul de elemente se poate modifica in timpul utilizarii acesteia, fie prin adaugarea de noi elemente, fie prin eliminarea unor elemente existente. In general, eelementele dintr-o colectie sunt diferite, dar se permite sa existe si elemente identice.

Ordinea elementelor dintr-o colectie nu este esentiala, dar trebuie sa existe o modalitate de a parcurge toate elementele colectiei pentru a cauta elementul dorit.

Principala deosebire dintre colelctie si structurile de tablou si de inregistrare, deja studiate, consta tocmai in faptul ca numarul de elemente ale colectiei este variabil, in timp ce la tablou si inregistrare este fixat in momentul in care se creeaza structura respectiva. Din aceasta cauza, se mai spune ca tabloul si inregistrarea sunt structuri statice, in timp ce colectiile sunt structuri dinamice.

Conceptul de iterator al colectiei

Pentru a se face posibila traversarea colectiei (adica parcurgerea tuturor elementelor colectiei unul dupa altul), s-a introdus conceptul abstract de iterator.

Iteratorul este un obiect care indica unul din elementele colectiei si permite sa se efectueze anumite operatii asupra colectiei in locul in care se gaseste elementul indicat, cum ar fi:
    - vizitarea elementului de colectie indicat de iterator;
    - eliminarea elementului indicat de iterator (operatie optionala);
    - pozitionarea iteratorului pe elementul urmator al colectiei.

Denumirea de iterator provine tocmai de la faptul ca acesta poate sa treaca de la un element la altul al colectiei, deci permite aplicarea unor algoritmi iterativi pe colectia respectiva.

Interfetele Collection si Iterator in Java

In SDK 1.2 colectiile sunt considerate structuri de date abstracte, specificate prin interfata java.util.Collection. Respectarea acestei intefete permite sa se abordeze in mod unitar toate clasele ale caror instante se incadreaza in conceptul de colectie. Se realizeaza astfel o unificare a metodelor prin care se fac operatii asupra tuturor claselor de colectii, ramanand ca fiecare clasa sa contina si metode specifice.

Principalele operatii care se fac asupra unei colectii sunt:
   - punerea unui nou element in colectie;
   - traversarea colectiei, adica parcurgerea colectiei element dupa element cu posibila "vizitare" a elementului respectiv;
   - cautarea unui element intr-o colectie;
   - eliminarea unui element din colectie.

In Java, iteratorul este instanta unei clase care implementeaza interfata java.util.Iterator.
 
Interfata java.util.Collection contine 15 metode, dintre care unele sunt obligatorii, iar altele sunt optionale. Daca este invocata una din metodele optionale corespunzatoare unei operatii nepermise intr-o anumita clasa de colectii, ea trebuie sa genereze o exceptie din clasa java.lang.UnsupportedOperationException

Metodele care realizeaza operatii obligatorii pentru toate clasele care implementeaza interfata Collection sunt urmatoarele:
   public boolean isEmpty() - intoarce true daca aceasta colectie este vida;
   public int size() - intoarce numarul de elemente din aceasta colectie;
   public boolean contains(Object o) - intoarce true daca obiectul o exista in colectie;
   public boolean containsAll(Collection c) - intoarce true daca in aceasta colectie exista toate elementele colectiei c;
   public Iterator iterator() - intoarce un Iterator pentru parcurgerea elementelor acestei colectii; in general, ordinea de parcurgere nu este garantata, dar in mod sigur pot fi parcurse toate elementele;
   public Object[] toArray() - intoarce un tablou de obiecte, care contine toate elementele acestei colectii;
   public Object[] toArray(Object[] a) - intoarce un tablou de obiecte, care contine toate elementele alcestei colectii, care apartin clasei tabloului a; de exemplu, daca tabloul a este declarat sub forma String[] a=new String[0], atunci tabloul intors va contine numai acele elemente ale colectiei, care apartin clasei String;
   public boolean equals(Object o) - compara aceasta colectie cu obiectul o si intoarce true daca ele sunt identice;
   public int hashCode() - intoarce un cod de dispersie pentru aceasta colectie.
Ultimele doua metode sunt cele care exista si in clasa Object, dar trebuie obligatoriu sa fie redefinite in orice clasa care implementeaza interfata Collection.

Metodele care realizeaza operatii optionale pentru clasele care implementeaza interfata Collection sunt urmatoarele:
   public boolean add(Object o) - adauga obiectul o la aceasta colectie si intoarce true daca adaugarea a reusit; motivul pentru care nu s-a facut efectiv adaugarea depinde de modul in care este implementata colectia respectiva: de exemplu ea ar putea sa nu accepte decat obiecte dintr-o anumita clasa, sau sa nu accepte adaugarea unui obiect deja existent in colectie;
   public boolean remove(Object o) - elimina din aceasta colectie un element identic cu o si intoarce true daca eliminarea a reusit; daca nu a reusit, inseamna ca obiectul o nu exista in colectie;
   public boolean addAll(Collection c) - adauga la aceasta colectie toate elementele colectiei c si intoarce true daca aceasta colectie s-a modificat ca rezultat al operatiei de adaugare;
   public boolean removeAll(Collection c) - elimina din aceasta colectie toate elementele existente si in colectia c; intoarce true daca aceasta colectie s-a modificat ca rezultat al operatiei de eliminare;
   public boolean retainAll(Collection c) - retine in aceasta colectie numai acele elemente care exista si in colectia c, eliminandu-le pe celelalte; intoarce true daca aceasta colectie s-a modificat in urma operatiei efectuate;
   public void clear() - elimina toate elementele existente in aceasta colectie;

Remarcam ca metodele optionale trebuie sa existe in orice clasa care implementeaza interfata Collection, la fel ca cele obligatorii; singura deosebire este ca, daca o anumita operatie optionala nu este permisa intr-o astfel de clasa, ea nu face altceva, decat ca intoarce o UnsupportedOperationException.

Interfata java.util.Iterator contine numai trei metode, din care numai primele doua sunt operatii obligatorii:
   public boolean hasNext() - intoarce true daca, in colectia careia ii este asociat acest iterator, mai exista cel putin un element neparcurs (hasNext inseamna ca exista un element urmator);
   public Object next() - acest iterator trece la urmatorul element al colectiei si intoarce o referinta catre elementul respectiv; daca nu exista un element urmator, intoarce o exceptie din clasa java.util.NoSuchElementException;
   public void remove() - poate fi invocata o singura data dupa fiecare invocare a metodei next() si elimina din colectie elementul indicat de acest iterator. Operatia este optionala. Daca ea nu este permisa pentru o anumita clasa de colectii, trebuie sa intoarca o UnsupportedOperationException. Daca a fost deja invocata dupa ultimul next(), intoarce o java.lang.IllegalStateException.

Fiecarei clase care implementeaza interfata Collection trebuie sa i se asocieze in mod obligatoriu cel putin o clasa cu interfata Iterator, ale carei instante sunt iteratori pentru colectia respectiva.

Clasa AbstractCollection

Clasa java.util.AbstractCollection constituie un prototip de implementare a interfetei Collection. Este o clasa abstracta, din care pot fi derivate diferite clase de colectii.
 
In clasa AbstractCollection sunt definite toate metodele interfetei Collection, cu urmatoarele exceptii care sunt pastrate ca metode abstracte:
   public abstract Iterator iterator()
   public abstract int size()
Celelalte metode sunt implementate, dar cele care corespund unor operatii optionale intorc o UnsupportedOperationException. In consecinta, programatorul care creaza o subclasa cu interfata Collection trebuie sa defineasca numai cele doua metode abstracte specificate mai sus si - daca este cazul - sa redefineasca metodele optionale.

In clasa AbstractCollection este, de asemenea redefinita metoda mostenita de la clasa Object
   public String toString()
astfel incat sa intoarca reprezentarea ca sir de caractere a colectiei.



© Copyright 2001 - Severin BUMBARU, Universitatea "Dunarea de Jos" din Galati