Mapy

Mapy w języku Java to klasy implementujące interfejs java.util.Map<K,V>. Mapy reprezentują związki obiektów z kluczami. Najpopularniejsze implementacje map to klasy: java.util.HashMap<K,V>java.util.LinkedHashMap<K,V>java.util.Hashtable<K,V> i java.util.TreeMap<K,V>, przy czym o ile nie ma powodu aby używać jakiejś konkretnej z pośród tych klas to powinniśmy używać klasy HashMap<K,V>. Typowa deklaracja i utworzenie obiektu mapy, w której wartościami są obiekty typu String a kluczami obiekty typu Integer wygląda następująco:

Map<Integer, String> myMap = new HashMap<Integer, String>();

Analogiczna deklaracja w Javie sprzed wersji 1.5, tj. wtedy kiedy kolekcje i mapy nie były jeszcze typowane, wyglądałaby tak:

Map myMap = new HashMap();

Podstawowe operacje dostępne dla map to dodawanie skojarzenia (klucza i wartości), pobieranie wartości skojarzonej z danym kluczem, sprawdzanie czy mapa zawiera skojarzenie dla danego klucza, usuwanie skojarzenia (klucza i wartości) dla danego klucza oraz sprawdzanie rozmiaru mapy, tj. liczby zapisanych w niej skojarzeń.

Operacja dodawania skojarzenia to dwuargumentowa operacja V put(K key, V value). Pierwszym argumentem wywołania jest klucz a drugim wartość. Jeśli mapa do której dodajemy skojarzenie nie zawierała uprzednio skojarzenia dla danego klucza to skojarzenie jest dodawane i zwracana jest wartość null. Jeśli mapa zawierała już skojarzenie o takim kluczu to zastępowana jest wartość dla tego skojarzenia (w mapie może być tylko jedna wartość dla danego klucza) i wartość zastępowana jest zwracana. Aby dodać skojarzenie do mapy myMap utworzonej w poprzednim przykładzie napisalibyśmy:

String oldValue = myMap.put(1, "Jan Kowalski");

Przykładowo, mapy mogli byśmy użyć do zaimplementowania książki adresowej domu studenckiego. Kluczem w naszym przykładzie byłby numer pokoju a wartością imię i nazwisko studenta mieszkającego w tym pokoju. Fragment takiego programu mógłby wyglądać następująco:

Map<Integer, String> dormPlan = new HashMap<Integer, String>();
  
// w tym miejscu umieszczamy kod który wypełni mapę dormPlan
  
// kwaterujemy studenta Jan Nowak w pokoju nr. 1
String prevStudent = dormPlan.put(1, "Jan Nowak");
  
if(prevStudent != null)
  System.out.println("Ups! Pokój był już zajęty!");

W powyższym przykładzie dodajemy do mapy dormPlan skojarzenie z kluczem 1 i wartością „Jan Nowak”, tj. kwaterujemy Jana Nowaka w pokoju nr. 1, a dopiero potem sprawdzamy czy pokój ten był wolny, tj. czy do klucza 1 nie była uprzednio przypisana inna wartość. Naturalnie mogli byśmy postąpić na odwrót, tj. wpierw sprawdzić czy pokój jest wolny, a dopiero potem kwaterować w nim nowego studenta.

Aby sprawdzić czy mapa zawiera skojarzenie dla pewnego klucza używamy metody boolean containsKey(Object key). Metoda ta zwraca wartość true jeśli mapa zawiera skojarzenie o danym kluczu a false w przeciwnym przypadku. Zaimplementujmy teraz w ramach ćwiczenia metodę, która znajdzie w akademiku wolny pokój dla nowego studenta. Przyjmujemy, że jest to akademik nie z tej ziemi, tj. nie dość że pokoje są jednoosobowe, to jeszcze jest ich nieskończenie wiele.

Aby pobrać wartość skojarzenia dla danego klucza używamy operacji V get(Object key). Jeśli mapa zawiera skojarzenie dla tego klucza to zwracana jest wartość tego skojarzenia. Jeśli mapa takiego skojarzenia nie zawiera to zwracana jest wartość null. Uwaga! Jeśli dodamy do mapy skojarzenie o pewnym kluczu i wartości null (co jest dopuszczalne), to metoda get(…) zwróci dla tego klucza wartość null, ale bynajmniej nie będzie to oznaczało, że skojarzenia o takim kluczu w mapie nie było. Wartość null zwracana przez metodę get(…) może zatem być po prostu wartością dla danego klucza, nie koniecznie musi oznaczać brak skojarzenia. Jeśli chcemy wiedzieć czy mapa zawiera skojarzenie dla danego klucza to powinniśmy używać metody containsKey(…) opisanej w poprzednim akapicie.

Skojarzenie dla danego klucza usuwamy z mapy za pomocą metody V remove(Object key). Metoda zwraca wartość usuwanego skojarzenia lub null jeśli skojarzenie o takim kluczu nie istniało.

Rozmiar mapy sprawdzamy tak samo jak rozmiar kolekcji, przy pomocy dobrze nam już znanej metody int size(). Metoda ta zwraca liczbę skojarzeń zapisanych w mapie.

0 0 votes
Daj ocenę