1. Wiele par: klucz-wartość.

Wiele par: klucz-wartość

Java ma jeszcze jedną interesującą kolekcję (w najszerszym tego słowa znaczeniu) — Map. Nie ma dokładnego tłumaczenia jego nazwy na język rosyjski: najczęściej nazywa się to „mapa”, „słownik” lub po prostu „mapa”.

Ta kolekcja jest podobna do kolekcji Set, tyle że nie przechowuje zestawu elementów, ale zestaw „par elementów”. Każda para elementów Mapskłada się z dwóch: „klucza” i „wartości”.

Załóżmy, że chcesz przechowywać w programie nazwiska pracowników firmy, ich wynagrodzenia lub nazwiska współpracowników i ich wiek. Wtedy potrzebujesz takiej tabeli:

Nazwa Wiek
Siergiej 21
Mikołaj 22
Iwan Pietrowicz 48
Anyuta ?

Każda linia zawiera parę wartości. Nazwijmy imię kluczem pary , a wiek wartością pary .

Cały zbiór takich par będzie nazywany mapą - Map.

Klucz pary może być dowolny, ale kluczem nie może być null. Klucze muszą być unikalne: jedna karta nie może zawierać dwóch identycznych kluczy.


2. KlasaHashMap

Klasa HashMapjest najpopularniejszą kolekcją wszystkich kart ( Map). Z jednej strony jest bardzo podobny do HashSet i ma wszystkie swoje metody, az drugiej strony wygląda jak lista ( ArrayList), gdyby indeksami listy nie były liczby, a słowa.

Możesz utworzyć obiekt typu HashMapza pomocą polecenia view:

HashMap<TКлюч, TЗначение> Nazwa = new HashMap<TКлюч, TЗначение>();

Gdzie TКлючjest typ kluczy w parze elementów, TЗначениеto typ wartości w parze elementów, które będą przechowywane w pliku HashMap.

Klasa HashMapposiada następujące metody:

metoda Opis
void put(ТКлюч key, ТЗначение value)
Dodaje parę ( key, value) do kolekcji
ТЗначение get(ТКлюч key)
Zwraca wartość według klucza.
boolean containsKey(ТКлюч key)
Sprawdza, czy klucz istnieje w kolekcji
boolean containsValue(ТЗначение value)
Sprawdza, czy wartość istnieje w kolekcji
ТЗначение remove(ТКлюч key)
Usuwa element z kolekcji
void clear()
Czyści kolekcję: usuwa wszystkie elementy
int size()
Zwraca liczbę par elementów w kolekcji
Set<ТКлюч> keySet()
Zwraca zestaw kluczy kolekcji
Collection<ТЗначение> values()
Zwraca zestaw elementów w kolekcji
Set<Map.Entry<TКлюч, TЗначение>> entrySet()
Zwraca wszystkie wartości w kolekcji jako zbiór ( Set) par ( Map.Entry).

Dodawanie elementów doHashMap

Elementy są dodawane do mapy jednocześnie parami: w tym celu plik put(). Klucz jest przekazywany jako pierwszy, wartość jako druga.

HashMap<String, Integer> map = new HashMap<String, Integer>();
map.put("Серега", 21);
map.put("Николай", 22);
map.put("Iwan Piotrович", 48);
map.put("Анюта", null);

Jeśli podczas dodawania elementu okaże się, że istnieje już element z takim samym kluczem, stara wartość klucza zostanie zastąpiona nową.

To zachowanie sprawia, że HashMap​​wygląda jak tablica lub lista, jeśli Stringzamiast liczb miały słowa ( ) jako indeksy.

Ważny:

Prawie każdy typ może działać jako typ klucza i typ wartości. Istnieje kilka drobnych dodatkowych wymagań dotyczących klucza typu, ale dowiesz się o nich, gdy szczegółowo przestudiujesz kolekcje w zadaniu Java Collections.



3. Podzbiory HashMap: zestaw kluczy

Powiedzmy, że chcemy po prostu wyświetlić wszystkie elementy HashMapna ekranie, jak to zrobić? Aby to zrobić, musisz zrozumieć, jak przejść przez wszystkie elementy HashMap. Można to zrobić na wiele sposobów.

Najprostszym sposobem jest użycie pętli klawiszy

Elementy klasy HashMapnie mają numeru seryjnego, więc pętla z licznikiem nie zadziała tutaj. Ale metodą możemy uzyskać wiele kluczy keySet(), a ty już wiesz, jak przejść przez zestaw:

Kod Opis
HashMap<String, Integer> map = new HashMap<String, Integer>();
map.put("Серега", 21);
map.put("Николай", 22);
map.put("Iwan Piotrович", 48);
map.put("Анюта", null);

for (String key: map.keySet())
{
   Integer value = map.get(key);
   System.out.println(key + " --> " + value);
}






Przejrzyj wszystkie klucze map

Uzyskaj wartość według klucza

Metoda keySet()zwraca zestaw kluczy. Zestaw możesz wykorzystać na dwa sposoby:

notacja zwarta długi wpis
for (String key: map.keySet())
{
   Integer value = map.get(key);
   System.out.println(key + " --> " + value);
}
Set<String> keys = map.keySet();

for (String key: keys)
{
   Integer value = map.get(key);
   System.out.println(key + " --> " + value);
}


4. Korzystanie z pętli nad parami

Istnieje bardziej skomplikowany sposób: możesz przekonwertować Mapna zestaw par elementów , a następnie użyć cyklu przez elementy zestawu, jak już się nauczyliśmy.

Kolekcja HashMapma klasę pomocniczą do przechowywania kilku elementów. Wygląda to mniej więcej tak:

class Entry<KeyType, ValueType>
{
   private KeyType key;
   private ValueType value;

   public KeyType getKey()
   {
      return this.key;
   }

   public ValueType getValue()
   {
      return this.value;
   }
}

Wynikiem wywołania metody entrySet()na obiekcie typu będzie typ :HashMap<ТКлюч, ТЗначение>Set<Entry<ТКлюч, ТЗначение>>

Set<Entry<Ключ, Значение>> Nazwa = map.entrySet();

Tutaj widzimy typ złożony Setz parametrem wartości, a inny typ złożony ( Entry) działa jako parametr wartości, również z dwoma parametrami.

Początkującemu bardzo łatwo jest się pomylić. Chociaż, jeśli rozumiesz, możesz napisać kod taki jak:

HashMap<String, Integer> map = new HashMap<String, Integer>();
map.put("Серега", 21);
map.put("Николай", 22);
map.put("Iwan Piotrович", 48);
map.put("Анюта", null);

Set<Map.Entry<String, Integer>> entries = map.entrySet();
for(Map.Entry<String, Integer> pair: entries)
{
   String key = pair.getKey();
   Integer value = pair.getValue();
   System.out.println(key + " --> " + value);
}

Chociaż ten kod można nieco uprościć:

Po pierwsze, nie można utworzyć osobnej zmiennej dla entries, ale natychmiast wywołać metodę entrySet()wewnątrz pętli for:

for(Map.Entry<String, Integer> pair: map.entrySet())
{
   String key = pair.getKey();
   Integer value = pair.getValue();
   System.out.println(key + " --> " + value);
}

Po drugie, możesz użyć nowo wprowadzonego operatora, varaby automatycznie wywnioskować typ pary elementów :

for(var pair: map.entrySet())
{
   String key = pair.getKey();
   Integer value = pair.getValue();
   System.out.println(key + " --> " + value);
}

Już dobrze, prawda?



5. Porównanie ArrayListvs.HashMap

HashMapbardzo przypomina ArrayList, w którym nie liczby są używane jako indeksy, ale słowa (lub inny rodzaj kluczy).

A jeśli używasz HashMap, Integerstaje się jeszcze bardziej jak ArrayList. Porównywać:

Kod z ArrayList<String> Kod z HashMap<Integer, String>
ArrayList<String> list = new ArrayList<String>();

list.add("Cześć");
list.add("Hello");

String s = list.get(0);
list.set(0, s + "!");

for (String item: list)
{
   System.out.println(item);
}
HashMap<Integer, String> map = new HashMap<Integer, String>();

map.put(0, "Cześć");
map.put(1, "Hello");

String s = map.get(0);
map.put(0, s + "!");

for (String item: map.values())
{
   System.out.println(item);
}