1. Набор от двойки ключ-стойност.

Набор от двойки ключ-стойност

В Java друга интересна колекция (най-общо казано) е Map. Понякога тази структура от данни се нарича също речник.

Той е подобен на Setколекцията, но съхранява набор от „двойки“ елементи, а не набор от елементи. Всяка двойка в се състои Mapот два елемента: „ключ“ и „стойност“.

Да приемем, че искате вашата програма да съхранява имената на служителите и техните заплати or имената на вашите колеги и тяхната възраст. Тогава ще ви трябва table като тази:

Име Възраст
Илон 21
Джеф 22
Бил 48
Уорън ?

Всеки ред съдържа няколко стойности. Ще наричаме името ключ на двойката, а възрастта - стойността на двойката .

Целият набор от тези двойки е нашата карта ( Map).

Ключът на двойка може да бъде всичко освен null. Ключовете трябва да са уникални: една карта не може да съдържа два еднакви ключа.


2. HashMapклас

Класът HashMapе най-популярният вид Mapколекция. От една страна, той е много подобен на HashSet и има всички негови методи. От друга страна, той е като списък ( ArrayList), който може да използва думи (or нещо друго) като свои индекси.

Можете да създадете, HashMapкато използвате израз като този:

HashMap<KeyType, ValueType> name = new HashMap<KeyType, ValueType>();

Къде KeyTypeе типът на ключовете в съхранените двойки и ValueTypeе типът на стойностите в двойките, съхранени в HashMapколекцията.

Класът HashMapима методи като този:

Метод Описание
void put(KeyType key, ValueType value)
Добавя двойката ( key, value) към колекцията
ValueType get(KeyType key)
Връща стойността, свързана с ключ.
boolean containsKey(KeyType key)
Проверява дали съществува ключ в колекцията
boolean containsValue(ValueType value)
Проверява за съществуването на стойност в колекцията
ValueType remove(KeyType key)
Премахва елемент от колекцията
void clear()
Изчиства колекцията, като премахва всички елементи
int size()
Връща броя на двойките ключ-стойност в колекцията
Set<KeyType> keySet()
Връща набора от ключове в колекцията
Collection<ValueType> values()
Връща набор, съдържащ елементите на колекцията
Set<Map.Entry<KeyType, ValueType>> entrySet()
Връща набор ( Set) от всички двойки ( Map.Entry) в колекцията.

Добавяне на елементи към aHashMap

Елементите се добавят към карта като двойки с помощта на put()метода. Ключът се предава като първи аргумент, а стойността се предава като втори.

HashMap<String, Integer> map = new HashMap<String, Integer>();
map.put("Elon", 21);
map.put("Jeff", 22);
map.put("Bill", 48);
map.put("Warren", null);

Когато добавяте двойка ключ-стойност, ако ключът вече съществува в колекцията, тогава старата стойност се заменя с новата стойност.

Това поведение създава HashMapподобен масив or списък, чиито индекси са думи ( String) instead of числа.

Важно:

Почти всеки тип може да бъде KeyType or ValueType. Има някои малки допълнителни изисквания за KeyType и ще научите за тях, когато изучавате по-подробно колекциите в мисията за колекции на Java.



3. Подмножества на a HashMap: множеството от ключове

Да кажем, че просто искаме да покажем всички записи в a HashMapна екрана. Как да направим това? За да направим това, трябва да знаем How да преминем през всички записи в HashMap. Това може да стане по няколко начина.

Най-лесният начин е да преминете през ключовете

HashMapзаписите не са номерирани последователно, така че цикъл с брояч няма да работи тук. Но можем да получим набор от ключове с помощта на keySet()метода и вие вече знаете How да обхождате набор:

Код Описание
HashMap<String, Integer> map = new HashMap<String, Integer>();
map.put("Elon", 21);
map.put("Jeff", 22);
map.put("Bill", 48);
map.put("Warren", null);

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






Преминете към ключовете на map

Вземете стойността, свързана с ключа

Методът keySet()връща набор от ключове. Можете да използвате този комплект по два начина:

Компактна нотация Дълга нотация
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. Обхождане на двойки ключ-стойност

Има и по-сложен начин: можете да трансформирате a Mapв набор от двойки ключ-стойност и след това да преминете през елементите на набора, Howто вече научихме.

Колекцията HashMapима помощен клас, който съхранява двойка ключ-стойност. Изглежда приблизително така:

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

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

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

Резултатът от извикването на entrySet()метода на обект ще бъде :HashMap<KeyType, ValueType>Set<Entry<KeyType, ValueType>>

Set<Entry<KeyType, ValueType>> name = map.entrySet();

Тук имаме генеричен Setклас с тип параметър, който от своя страна е генеричен тип ( Entry) с два тип параметъра.

Много е лесно за начинаещ да се обърка в това. Но след като го разберете, можете да напишете code като:

HashMap<String, Integer> map = new HashMap<String, Integer>();
map.put("Elon", 21);
map.put("Jeff", 22);
map.put("Bill", 48);
map.put("Warren", 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);
}

Въпреки това този code може да бъде малко опростен:

Първо, можете да пропуснете създаването на отделна променлива за entriesи instead of това да извикате entrySet()метода директно в forцикъла:

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

Второ, можете да използвате наскоро въведения varоператор за автоматично извеждане на типа на двойката ключ-стойност :

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

Не е лошо, а?



5. Сравнение на ArrayListиHashMap

A HashMapсилно прorча на ArrayList, което позволява низове (or други типове) да се използват като индекси (ключовете).

Ако използвате Integerза ключовете в HashMap, то става още по-подобно на ArrayList. Да сравним:

Код с ArrayList<String> Код с HashMap<цяло число, низ>
ArrayList<String> list = new ArrayList<String>();

list.add("Greetings");
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, "Greetings");
map.put(1, "Hello");

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

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