Skaczemy ponownie do Javy i teraz pokażę Wam jak 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 ze względu na zachowanie tagów, będę korzystał naprzemiennie z obu tych nazw. Przejdźmy do wyjaśnienia jak w języku Java korzystać ze słownika.

HASHMAP JAKO STRUKTURA 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". Pozwólcie, że przedstawię Wam całkiem inną kolekcję danych, która pełni funkcję słownika. Słownik jest to typ danych przechowujący parę "klucz-wartość". To znaczy, że jeden klucz (najczęściej w postaci łańcucha, ale wcale nie musi tak być) jest przypisany dokładnie jednej wartości. To w pewnym sensie działa jak według definicji funkcji w matematyce (jednemu elementowi ze zbioru X jest przypisany tylko jeden element zbioru Y). Ale tylko w pewnym sensie bo wartości mogą się powtarzać, ale klucze już NIE! Wiem, że to już może wyglądać nudnie, natomiast ponownie zademonstruję wykorzystanie w kodzie źródłowym. Mam taki zwyczaj, że zawsze odseparowuję klasę z funkcją "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 javaX.util.HashMap;

public class Launcher
{
	private 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((key, value) -> System.out.println("Imię: " + key + ", poziom: " + value));
	}
}

Oto dwie klasy prezentujące strukturę "HashMap". Mała informacja: w nazwie importu znajduje się literówka. Celowo ją wstawiłem, gdyż Joomla za każdym razem wywalała mi błąd gdy zostawiłem frazę "java" przez co niemożliwym było zapisanie artykułu. Po prostu usuńcie literę "X" i będzie w porządku.

Przyglądając się początkowi klasy "Launcher" mamy nasz "HashMap" a ponieważ każda kolekcja danych w Javie korzysta z typów generycznych, umieszczamy nawiasy trójkątne. W nich podajemy parę typów dla klucza i wartości. W naszym przykładzie słownik przedstawia listę postaci oraz przechowuje poziom doświadczenia każdej z nich. Naszym kluczem jest łańcuch znaków, a wartością, liczba całkowita. W konstruktorze umieszczamy dwie metody, jedna dodaje klucze do słownika, a druga wypisuje je wszystkie.

Metoda "createKeys" prezentuje dodawanie kluczy do naszego słownika (czy lepiej, "tablicy asocjacyjnej"). Prosta sprawa. Funkcja "put", a następnie wstawiamy klucz zgodny z typem instancji oraz wartość, również zgodną z typem instancji. Gdybyśmy dla przykładu dali "float" jako typ wartości, to wtedy moglibyśmy również dorzucać wartości zmiennoprzecinkowe. To samo się tyczy klucza jednak nie miałoby to sensu bo przypominam, że klucze NIE mogą się powtarzać.

Druga metoda wypisuje wszystkie klucze i wartości przy pomocy funkcji "forEach" i wyrażenia lambda (w dużym skrócie i jednym zdaniem, wyrażenie lambda umożliwia ekspresowe tworzenie "funkcji anonimowych" czyli takich, które występują tylko dla tego przypadku w którym to osadzacie). Poświęcę artykuł na temat takiego zapisu, a na razie wystarczy, że skupicie się na tym, że to nam wypisze wszystkie klucze i wartości "podpięte" do nich. Jedna po drugiej, natomiast chcę przestrzec przed czymś bardzo ważnym!

"HashMap" 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 jest dowolna. Jeżeli kiedykolwiek będziecie chcieli, aby kolejność była zachowywana taka sama, wystarczy jedynie, że zamienicie "HashMap" na "LinkedHashMap". Jest to alternatywna kolekcja zachowująca tę samą kolejność w której dochodziło do wprowadzania kluczy za pomocą "put". Możecie (przynajmniej w Javie) również osadzić odrębne obiekty jako typ danych zarówno dla jednego, i drugiego.


Artykuł może wydawać się chaotyczny, ale to tylko dlatego, że nie mam już takiego zapału do pisania. To już przestaje być fajne, a mam jeszcze cały miesiąc pisania dwa razy pod rząd. Nie ma czego zazdrościć...

PODOBNE ARTYKUŁY