Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Вивчайте Що таке Map? | Володіння Map у Java
Структури Даних Java

bookЩо таке Map?

Свайпніть щоб показати меню

Ми розглянемо інтерфейс Map у Java. Інтерфейс Map є частиною Java Collections framework і визначає методи для роботи з даними у вигляді пар ключ-значення.

Розглянемо визначення:

Основна реалізація такої структури даних у Java — це HashMap, яка реалізує інтерфейс Map. Дослідимо основні методи та принципи роботи цієї реалізації.

Почнемо з оголошення та методів:

Main.java

Main.java

copy
1
Map<K, V> map = new HashMap<>();

Тут ви бачите, що у generics або діамантових дужках вказуються два значення:

  • Значення K відповідає типу даних для ключа;
  • Значення V відповідає типу даних для значення.

Таким чином, при оголошенні цієї структури даних ми вказуємо типи даних для наших пар ключ-значення.

Тепер розглянемо методи, визначені в інтерфейсі Map.

Методи

V put(K key, V value): встановлює вказане значення для вказаного ключа у цьому Map. Якщо у Map раніше вже існувало відображення для цього ключа, старе значення замінюється.

Main.java

Main.java

copy
1234567891011121314
package com.example; import java.util.HashMap; import java.util.Map; public class Main { public static void main(String[] args) { Map<Integer, String> map = new HashMap<>(); map.put(1, "One"); map.put(2, "Two"); map.put(3, "Three"); System.out.println(map); } }

V get(Object key): повертає значення, яке відповідає вказаному ключу, або null, якщо цей Map не містить відображення для ключа.

Тут ми вказуємо ключ для отримання відповідного значення.

Отримаємо значення за ключем 2:

Main.java

Main.java

copy
12345678910111213141516
package com.example; import java.util.HashMap; import java.util.Map; public class Main { public static void main(String[] args) { Map<Integer, String> map = new HashMap<>(); map.put(1, "One"); map.put(2, "Two"); map.put(3, "Three"); System.out.println("Map: " + map); String value = map.get(2); System.out.println("Value: " + value); } }
  • boolean containsKey(Object key): повертає true, якщо Map містить відображення для вказаного ключа;

  • boolean containsValue(Object value): повертає true, якщо Map містить один або більше ключів, що відображаються на вказане значення.

Ці два методи очевидно пов'язані і допомагають визначити, чи містить вказаний Map потрібні ключі або значення. Ці методи зручно використовувати як умови, оскільки вони повертають boolean значення.

Розглянемо приклад:

Main.java

Main.java

copy
12345678910111213141516171819202122232425
package com.example; import java.util.HashMap; import java.util.Map; public class Main { public static void main(String[] args) { Map<Integer, String> map = new HashMap<>(); map.put(1, "One"); map.put(2, "Two"); map.put(3, "Three"); System.out.println("Map: " + map); if (map.containsKey(2)) { System.out.println("Value with key 2: " + map.get(2)); } else { System.out.println("There is no value with key 2!"); } if (map.containsValue("Four")) { System.out.println(map.get(4)); } else { System.out.println("There is no key with value \"Four\"!"); } } }

У наведеному вище прикладі перевіряється наявність ключа та наявність значення у Map. Якщо значення знайдено, вони відображаються у консолі. Якщо таких значень немає, виводяться повідомлення про відсутність таких даних.

  • boolean isEmpty(): повертає true, якщо цей Map не містить жодних пар ключ-значення;

  • V remove(Object key): видаляє відображення для заданого ключа з цього Map, якщо він присутній, і повертає попереднє значення.

Як і в інших структурах даних, можна видаляти елементи з Map.

Main.java

Main.java

copy
12345678910111213141516
package com.example; import java.util.HashMap; import java.util.Map; public class Main { public static void main(String[] args) { Map<Integer, String> map = new HashMap<>(); map.put(1, "One"); map.put(2, "Two"); map.put(3, "Three"); System.out.println("Map: " + map); String removedElement = map.remove(3); System.out.println("Removed value: " + removedElement + ".\nMap after the removal operation: " + map); } }

Таким чином, ми можемо видаляти елементи за ключем.

Основні методи для керування Map

Далі наведені методи, з якими ви вже знайомі, і я їх перерахую без прикладів. Але залишилися також цікаві методи.

Почнемо з основних:

  • void clear(): видаляє всі елементи з Map;

  • int size(): повертає кількість пар ключ-значення у цьому Map;

  • void putAll(Map<? extends K, ? extends V> m): копіює всі відображення із вказаного Map у цей Map.

Тепер перейдемо до методів, які повертають колекцію зі значеннями (або ключами) з Map. Іншими словами, ми отримуємо з цієї структури даних структуру, що містить лише значення (або ключі). Наприклад, ArrayList<>.

Main.java

Main.java

copy
12345678910111213141516
package com.example; import java.util.*; public class Main { public static void main(String[] args) { Map<Integer, String> map = new HashMap<>(); map.put(1, "One"); map.put(2, "Two"); map.put(3, "Three"); System.out.println("Map: " + map); Collection<String> list; list = map.values(); System.out.println("Values" + list); } }

Тут ми отримали колекцію значень із Map. Тепер цю колекцію можна передати в ArrayList:

Main.java

Main.java

copy
123456789101112131415161718
package com.example; import java.util.*; public class Main { public static void main(String[] args) { Map<Integer, String> map = new HashMap<>(); map.put(1, "One"); map.put(2, "Two"); map.put(3, "Three"); System.out.println("Map: " + map); Collection<String> collection; collection = map.values(); System.out.println("Values" + collection); List<String> arrayList = new ArrayList<>(collection); System.out.println("ArrayList: " + arrayList); } }

Ми ініціалізували ArrayList, використовуючи значення з Map.

Існує також метод, який повертає ключі з Map. Однак ці ключі повертаються у вигляді структури під назвою Set. Ми не будемо зараз детально розглядати цю структуру даних; варто зазначити, що Set — це структура даних, яка містить виключно унікальні значення.

Розглянемо цей метод:

Set<K> keySet(): повертає представлення ключів у вигляді Set, які містяться у цьому Map.

Main.java

Main.java

copy
12345678910111213141516
package com.example; import java.util.*; public class Main { public static void main(String[] args) { Map<Integer, String> map = new HashMap<>(); map.put(1, "One"); map.put(2, "Two"); map.put(3, "Three"); System.out.println("Map: " + map); Set<Integer> keys; keys = map.keySet(); System.out.println("Keys: " + keys); } }

Таким чином, ми також можемо отримати набір усіх ключів з Map.

Отже, здається, ми завершили з методами. Тепер розглянемо використання Map, а також практичні приклади:

Використання Map

Структура типу ключ-значення має багато практичних застосувань. Розглянемо найпростішу з таких структур: система оцінювання студентів.

Створимо Map, де ключ має тип String, що представляє ім'я студента, а значення має тип Integer, що представляє оцінку студента. Таким чином, можна призначати оцінки студентам і легко отримувати оцінку конкретного студента за ключем:

Main.java

Main.java

copy
12345678910111213141516
package com.example; import java.util.*; public class Main { public static void main(String[] args) { Map<String, Integer> studentsGrades = new HashMap<>(); studentsGrades.put("Bob", 9); studentsGrades.put("Alice", 8); studentsGrades.put("Mike", 5); studentsGrades.put("John", 10); studentsGrades.put("Martin", 7); studentsGrades.put("Peter", 5); System.out.println("Student's grades: " + studentsGrades); } }

Тепер уявімо, що нам потрібно отримати оцінки Mike та Alice, а потім порівняти їх. Це можна легко зробити за допомогою методів, які ви вивчили вище. Реалізуємо це у коді:

Main.java

Main.java

copy
123456789101112131415161718192021
package com.example; import java.util.*; public class Main { public static void main(String[] args) { Map<String, Integer> studentsGrades = new HashMap<>(); studentsGrades.put("Bob", 9); studentsGrades.put("Alice", 8); studentsGrades.put("Mike", 5); studentsGrades.put("John", 10); studentsGrades.put("Martin", 7); studentsGrades.put("Peter", 5); System.out.println("Student's grades: " + studentsGrades); Integer mikeGrade = studentsGrades.get("Mike"); Integer aliceGrade = studentsGrades.get("Alice"); System.out.println(mikeGrade.compareTo(aliceGrade) == -1 ? "Alice's grade is higher": "Mike's grade is higher"); } }

Було використано тернарний оператор та метод compareTo() обгортки Integer. Якщо ви не розумієте, як це працює, це можна пояснити наступним чином:

Main.java

Main.java

copy
12345678910111213141516171819202122232425
package com.example; import java.util.*; public class Main { public static void main(String[] args) { Map<String, Integer> studentsGrades = new HashMap<>(); studentsGrades.put("Bob", 9); studentsGrades.put("Alice", 8); studentsGrades.put("Mike", 5); studentsGrades.put("John", 10); studentsGrades.put("Martin", 7); studentsGrades.put("Peter", 5); System.out.println("Student's grades: " + studentsGrades); Integer mikeGrade = studentsGrades.get("Mike"); Integer aliceGrade = studentsGrades.get("Alice"); if (mikeGrade.compareTo(aliceGrade) == -1) { System.out.println("Alice's grade is higher"); } else { System.out.println("Mike's grade is higher"); } } }

Тепер розглянемо ситуацію, коли потрібно зібрати всіх студентів з оцінкою вище 7 (не включаючи 7). Це стає цікаво, і зараз я поясню, як це зробити!

Ітерація по Map

Ітерацію по елементах Map у Java можна виконати різними способами, які надає інтерфейс Map та його реалізації. Ось декілька способів ітерації по Map:

Ітерація по ключах (keySet()): метод keySet() повертає множину всіх ключів у Map. Цю множину можна використати для ітерації по ключах та отримання відповідних значень.

Main.java

Main.java

copy
12345678910111213141516
package com.example; import java.util.*; public class Main { public static void main(String[] args) { Map<String, Integer> map = new HashMap<>(); map.put("Key1", 1); map.put("Key2", 2); for (String key : map.keySet()) { Integer value = map.get(key); System.out.println("Key: " + key + ", Value: " + value); } } }

Ітерація по значеннях (values()): метод values() повертає колекцію всіх значень у Map. Цю колекцію можна використовувати для ітерації по значеннях.

Main.java

Main.java

copy
123456789101112131415
package com.example; import java.util.*; public class Main { public static void main(String[] args) { Map<String, Integer> map = new HashMap<>(); map.put("Key1", 1); map.put("Key2", 2); for (Integer value : map.values()) { System.out.println("Value: " + value); } } }

Ітерація по парах ключ-значення (entrySet()): метод entrySet() повертає набір об'єктів Map.Entry, які представляють пари ключ-значення. Це дозволяє ітеруватися безпосередньо по парах.

Main.java

Main.java

copy
1234567891011121314151617
package com.example; import java.util.*; public class Main { public static void main(String[] args) { Map<String, Integer> map = new HashMap<>(); map.put("Key1", 1); map.put("Key2", 2); for (Map.Entry<String, Integer> entry : map.entrySet()) { String key = entry.getKey(); Integer value = entry.getValue(); System.out.println("Key: " + key + ", Value: " + value); } } }

Розглянемо це детальніше. Спочатку це може здатися надзвичайно складним для розуміння, але не потрібно заглиблюватися в деталі роботи, оскільки синтаксис завжди однаковий.

Map.Entry<K, V> entry : map.entrySet()

Використовуючи об'єкт entry, можна одночасно отримати і ключ, і значення у Map. Тепер виконаємо завдання, наведене раніше, використовуючи entry set: отримати всіх студентів з оцінкою більшою за 7. Для цього використаємо перевірку через entry.getValue(), і коли знайдемо відповідних студентів, додамо їх ключі у заздалегідь створений ArrayList:

Main.java

Main.java

copy
1234567891011121314151617181920212223242526
package com.example; import java.util.*; public class Main { public static void main(String[] args) { Map<String, Integer> studentsGrades = new HashMap<>(); studentsGrades.put("Bob", 9); studentsGrades.put("Alice", 8); studentsGrades.put("Mike", 5); studentsGrades.put("John", 10); studentsGrades.put("Martin", 7); studentsGrades.put("Peter", 5); System.out.println("Student's grades: " + studentsGrades); List<String> studentsWithGradeHigherThanSeven = new ArrayList<>(); for (Map.Entry<String, Integer> entry : studentsGrades.entrySet()) { if (entry.getValue() > 7) { studentsWithGradeHigherThanSeven.add(entry.getKey()); } } System.out.println(studentsWithGradeHigherThanSeven); } }

Отже, ви можете ітеруватися по Map і знаходити потрібний список студентів, які склали іспит!

Entry set — це дуже корисний інструмент, оскільки дозволяє різними способами ітерації по Map за допомогою циклу, маючи доступ і до ключа, і до значення.

У наступному розділі ми детально розглянемо, як насправді працює HashMap, який ми так активно використовували у цьому розділі!

1. Який інтерфейс у Java представляє колекцію пар ключ-значення?

2. Як перебрати всі ключі в Map за допомогою циклу for-each?

3. Яке призначення методу values() у Map?

4. Який метод використовується для перевірки наявності певного ключа у Map?

5. Який метод використовується для видалення пари ключ-значення з Map у Java?

question mark

Який інтерфейс у Java представляє колекцію пар ключ-значення?

Select the correct answer

question mark

Як перебрати всі ключі в Map за допомогою циклу for-each?

Select the correct answer

question mark

Яке призначення методу values() у Map?

Select the correct answer

question mark

Який метод використовується для перевірки наявності певного ключа у Map?

Select the correct answer

question mark

Який метод використовується для видалення пари ключ-значення з Map у Java?

Select the correct answer

Все було зрозуміло?

Як ми можемо покращити це?

Дякуємо за ваш відгук!

Секція 3. Розділ 1

Запитати АІ

expand

Запитати АІ

ChatGPT

Запитайте про що завгодно або спробуйте одне із запропонованих запитань, щоб почати наш чат

Секція 3. Розділ 1
some-alt