Mapări

Conceptul de mapare

Fie K o mulțime de obiecte numite chei si V o mulțime de obiecte numite valori. Se numește mapare (engleză: map) sau dicționar (engleză: dictionary) o mulțime de perechi cheie-valoare, deci o submulțime a produsului cartezian K x V, în care nu există două elemente cu aceeași cheie. Pot însă exista elemente cu chei diferite, cărora le corespunde aceeași valoare.


- Figura 1 -

În figura 1 este reprezentată o mapare, în care K1, K2, K3, K4 sunt chei, iar V1, V2, V3 sunt valori. Fiecare pereche de obiecte (Ki, Vi) unite prin săgeată este o intrare a mapării (un element al acesteia).

Mapările sunt frecvent folosite atunci când căutarea valorii trebuie făcută după cheie. Un exemplu frecvent întâlnit este dicționarul, în care cheia este un cuvânt, iar valoarea este un text explicativ. Un alt exemplu frecvent întâlnit în informatică sunt fișierele de date, în care căutarea articolelor se face după cheie. Există și alte structuri de date care se încadrează în conceptul de mapare, dintre care unele vor fi studiate în secțiunile următoare.

Interfețele Map și MapEntry

În pachetul java.util, maparea este un tip de date abstract, specificat prin interfețele java.util.Map pentru mapări și java.util.MapEntry pentru intrările (elementele) mapărilor.

Interfața Map este utilizată la crearea claselor de mapări. Deși maparea este, la nivel conceptual, o mulțime de perechi cheie-valoare, interfața Map nu extinde interfața Set. Această soluție s-a adoptat deoarece în interfața Set (și în superinterfața sa Collection) există unele metode care nu sunt potrivite pentru o mapare. Atât cheia, cât și valoarea intrării în mapare sunt obiecte (adică instanțe ale unor clase Java).
 
Metodele interfeței Map prin care se realizează operațiile de bază asupra mapării sunt:
   public boolean isEmpty() - testează dacă maparea este vidă;
   public int size() - întoarce numărul de chei (de perechi cheie-valoare) existente în mapare;
   public Object put(Object key,  Object value) - introduce în mapare o nouă intrare (o pereche cheie-valoare). Dacă cheia key deja există, se înlocuiește valoarea existentă la cheia respectivă cu valoarea nouă și se întoarce valoarea veche. Daca cheia nu există deja, se introduce noua pereche cheie-valoare și se întoarce null.
   public Object get(Object key) - întoarce valoarea asociată cheii date ca argument;
   public Object remove(Object key) - elimină din mapare intrarea cu cheia key și întoarce valoarea asociată acestei chei; dacă cheia key nu există, întoarce null.
   public boolean containsKey(Object key) - testează dacă cheia dată există în mapare;
   public boolean containsValue(Object value) - testează dacă valoarea dată există în mapare;
   public void putAll(Map t) - pune în această mapare toate intrările existente în maparea t. Dacă o cheie din texistă deja în această mapare, se înlocuiește valoarea veche cu cea din t;
   public void clear() - se elimină toate intrările mapării.

Interfața Map oferă utilizatorilor trei vederi asupra mapării, adică posibilitatea de a privi aceeași mapare sub trei aspecte (din trei puncte de vedere) diferite: ca o mulțime de chei, ca o colecție de valori sau ca o mulțime de perechi cheie-valoare. Parcurgerea elementelor mapării poate fi, deci, facută după oricare din aceste trei vederi, folosind iteratorii respectivi (de mulțime sau de colecție).
 
Aceste vederi pot fi obținute prin următoarele metode:
   public Set keySet() - întoarce mulțimea cheilor existente în mapare;
   public Collection values() - întoarce colecția valorilor existente în mapare;
   public Set entrySet() - întoarce mulțimea intrarilor mapării, adică mulțimea perechilor cheie-valoare.

Intrările unei mapări care respecța interfața Map trebuie să respecte, la rândul lor interfața interioară Map.Entry.
 
Metodele interfeței Map.Entry sunt următoarele:
   public Object getKey() - întoarce cheia intrării respective;
   public Object getValue() - întoarce valoarea conținută în această intrare;
   public Object setValue(Object value) - înlocuiește valoarea veche cu cea primită ca argument și întoarce valoarea veche;
   public boolean equals(Object o) - compară această cheie cu obiectul o (se redefinește deci obligatoriu metoda equals din clasa Object);
   public int hashCode() - întoarce codul de dispersie al acestei intrări, calculat cu expresia
    (e.getKey()==null   ? 0 : e.getKey().hashCode()) ^
    (e.getValue()==null ? 0 : e.getValue().hashCode())
 unde operatorul ^ este "sau exclusiv pe biți". În acest fel, două intrări identice au același cod de dispersie.

 



© Copyright 2001 - Severin BUMBARU, Universitatea "Dunărea de Jos" din Galați