Jason. Cała informatyka w jednym miejscu!

Pokażę Wam jak w języku Java korzystać z mniej znanej struktury danych kryjącą się pod nazwą "HashMap". Użytkownicy Pythona raczej będą ją nazywali "słownikiem". Ja też wolę to stwierdzenie, natomiast będę korzystał naprzemiennie z obu tych nazw. Przejdźmy do wyjaśnienia jak w języku Java korzystać ze słownika.

"HASHMAP" W JĘZYKU JAVA JAKO KOLEKCJA MNIEJ ZNANA OD "ARRAYLIST"

Niech zgadnę. Najczęściej korzystacie z "ArrayList", prawda ;)? Może czas poznać chociaż parę innych struktur, bo przecież "nie tylko tablicą dynamiczną Java żyje" :D. Pozwólcie, że przedstawię Wam całkiem inną kolekcję danych, która pełni funkcję słownika. Słownik jest to jedna z kolekcji przechowującej pary "klucz-wartość" (tutaj jest artykuł poświęcony samym kolekcjom). To znaczy, że jeden klucz (najczęściej w postaci łańcucha znaków, ale wcale nie musi tak być) jest przypisany dokładnie do jednej wartości.

Dwie najważniejsze informacje jakie dotyczą par są takie, że po pierwsze, możliwość korzystania z dowolnego typu danych dla klucza i wartości zawdzięczamy typom generycznym, a po drugie, wartości mogą się powtarzać, ale klucze już nie! Próba dodania nowej pary o takim samym kluczu skończy się nadpisaniem poprzedniej pary!!!

PRZYKŁAD KODU ŹRÓDŁOWEGO

Ponownie zademonstruję wykorzystanie w kodzie źródłowym. Mam taki zwyczaj, że zawsze odseparowuję klasę z metodą "main" od całej reszty, aby uniknąć konieczności wykorzystywania statycznych metod. Tak wygląda program w całości:

KLASA "MAIN"

public class Main {
	public static void main(String[] args) {
		new Launcher();
	}
}

KLASA "LAUNCHER"

import java .util.HashMap;

public class Launcher {
	private final HashMap<String, Integer> characters = new HashMap<>();

	public Launcher() {
		createKeys();
		printKeys();
	}

	private void createKeys() {
		characters.put("Jacek", 25);
		characters.put("Celina", 25);
		characters.put("Karol", 23);
		characters.put("Zdzisław", 46);
		characters.put("Karolina", 22);
	}

	private void printKeys() {
		characters.forEach((k, v) -> System.out.println("Imię: " + k + ", lat " + v));
	}
}

Oto przykład prezentujący strukturę "HashMap" w języku Java. Przyglądając się początkowi klasy "Launcher", mamy nasz "HashMap" a ponieważ każda kolekcja danych korzysta z typów generycznych, umieszczamy nawiasy trójkątne. W nich podajemy typy danych dla klucza i wartości. W naszym przykładzie słownik przechowuje imiona i wiek każdej z osób jako liczbę całkowitą. Naszym kluczem jest zatem typ "String", a wartością, "int" (używając typów ogólnych korzystamy z nazw klas opakowujących dla typów prostych!). W konstruktorze umieszczamy dwie metody. Jedna dodaje pary do słownika, a druga wypisuje je wszystkie po kolei używając konstrukcji "forEach".

Metoda "createKeys" dodaje pary do naszego słownika (tablicy asocjacyjnej). Wywołujemy metodę "put", a następnie wstawiamy klucz zgodny z typem wstawionym w nawiasach trójkątnych oraz wartość, również zgodną z tym drugim typem. Typy ogólne podnoszą bezpieczeństwo typów, stąd nie wolno nam umieszczać typów danych innych niż tych, które podano w czasie deklaracji. Gdybyśmy dla przykładu dali "float" jako typ wartości, to wtedy moglibyśmy umieszczać wartości zmiennoprzecinkowe.

Jako typ danych kluczy wstawiłem łańcuch znaków, który dla dużego zbioru danych okazałby się niepraktyczny. Na tym świecie chodzi niejeden człowiek o imieniu Zdzisław, a przypominam, że klucze NIE mogą się powtarzać! W związku z tym, próba dodania nowej osoby o tym samym imieniu spowodowałaby nadpisanie tamtej wartości i utratę poprzednich danych!!! Najlepiej już wstawić typ jako własną klasę i zadbać o unikatowość odpowiednio przesłaniając dwie metody.

Druga metoda wypisuje wszystkie klucze i wartości przy pomocy metody "forEach" i wyrażenia lambda. To nam wypisze wszystkie klucze i wartości "podpięte" do nich, jedna po drugiej. Chcę przestrzec przed czymś bardzo ważnym"HashMap" w języku Java NIE zapisuje kolejności dodawania nowych kluczy! Słownik jedynie gwarantuje, że wszystkie pary będą przechowywane. Przy powyższym wypisaniu wszystkich kluczy i wartości za pomocą "System.out.println" zobaczycie w konsoli, że kolejność wypisywanych kluczy może nie być zgodna z kolejnością wprowadzania nowych par wartości! Jeżeli kiedykolwiek będziecie chcieli, aby kolejność była zachowywana taka sama, wystarczy jedynie że zamienicie "HashMap" na "LinkedHashMap". Jest to alternatywna kolekcja słownikowa, która zapamiętuje kolejność wprowadzanych kluczy za pomocą "put".


I to byłby koniec najistotniejszych informacji o kolekcji "HashMap". Opanujcie podstawy, a gwarantuję, że w przyszłości choć jeden raz przyda się Wam słownik :D!

PODOBNE ARTYKUŁY