logo

Java 8 Multimap

Java надає різноманітні корисні вбудовані бібліотеки колекцій. Але іноді нам потрібні спеціальні типи колекцій, які не є вбудованими в стандартну бібліотеку Java. Однією з цієї колекції є Multimap . У цьому розділі ми дізнаємося, що таке мультимап і як реалізувати мультимап у Java, і Мультикартовий інтерфейс бібліотеки Гуава.

Java Multimap

На Java, Карта це структура даних, яка дозволяє нам зіставляти ключ із значенням. З іншого боку, multimap — це новий тип колекції, знайдений у бібліотеці Guava, який дозволяє зіставляти один ключ із декількома значеннями (наприклад, відносини «один до багатьох» у СУБД). Але зауважте, що JDK не дозволяє мультивідображення.

Java 8 Multimap

Альтернативне рішення для впровадження мультимап у Java за допомогою бібліотеки Google Guava та бібліотек Apache Commons Collections. Обидва забезпечують реалізацію інтерфейсу Multimap. Він може зберігати більше одного значення для одного ключа. І ключі, і значення зберігаються в колекції та розглядаються як альтернатива Карта або Карта (стандартний JDK Collections Framework).

індійська актриса рані мукерджі

Але використання Multimap бібліотеки Google Guava нам не дуже допоможе. Замість цього ми реалізуємо наш власний клас Multimap у Java, який також можна відповідним чином налаштувати. У Java легко написати клас Multimap.

Наступна програма Java описує реалізацію класу Multimap у Java за допомогою Map і колекції.

Реалізація Java Multimap

MultimapExample.java

Excel видалити перший символ
 import java.util.*; class MultiMap { //creating a map of key and value (collection) private Map<k, collection> map = new HashMap(); //add the specified value with the specified key in this multimap public void put(K key, V value) { if (map.get(key) == null) { map.put(key, new ArrayList()); } map.get(key).add(value); } //associate the specified key with the given value if not already associated with a value public void putIfAbsent(K key, V value) { if (map.get(key) == null) { map.put(key, new ArrayList()); } // if the value is absent, insert it if (!map.get(key).contains(value)) { map.get(key).add(value); } } //the method returns the Collection of values to which the specified key is mapped, or null if this multimap contains no mapping for the key public Collection get(Object key) { return map.get(key); } //the method returns a set view of the keys contained in this multimap public Set keySet() { return map.keySet(); } //the method returns a set view of the mappings contained in this multimap public Set<map.entry<k, collection>&gt; entrySet() { return map.entrySet(); } //the method returns a Collection view of Collection of the values present in this multimap public Collection<collection> values() { return map.values(); } //Returns true if this multimap contains a mapping for the specified key. public boolean containsKey(Object key) { return map.containsKey(key); } //Removes the mapping for the specified key from this multimap if present and returns the Collection of previous values associated with the key, or null if there was no mapping for key public Collection remove(Object key) { return map.remove(key); } //Returns the total number of key-value mappings in this multimap. public int size() { int size = 0; for (Collection value: map.values()) { size += value.size(); } return size; } //Returns true if this multimap contains no key-value mappings. public boolean isEmpty() { return map.isEmpty(); } //Removes all the mappings from this multimap. public void clear() { map.clear(); } //Removes the entry for the specified key only if it is currently mapped to the specified value and returns true if removed public boolean remove(K key, V value) { if (map.get(key) != null) // key exists return map.get(key).remove(value); return false; } //Replaces the entry for the specified key only if currently mapped to the specified value and return true if replaced public boolean replace(K key, V oldValue, V newValue) { if (map.get(key) != null) { if (map.get(key).remove(oldValue)) { return map.get(key).add(newValue); } } return false; } } //main class public class MultimapExample { //main method public static void main(String args[]) { //Creating a multimap of type String MultiMap multimap = new MultiMap(); //adding values to the multimap multimap.put(&apos;a&apos;, &apos;Andrew&apos;); multimap.put(&apos;b&apos;, &apos;Albert&apos;); multimap.put(&apos;b&apos;, &apos;Tom&apos;); multimap.put(&apos;d&apos;, &apos;Sam&apos;); multimap.put(&apos;d&apos;, &apos;Reo&apos;); multimap.put(&apos;g&apos;, &apos;Jack&apos;); multimap.put(&apos;g&apos;, &apos;David&apos;); System.out.println(&apos;----- Printing Multimap using keySet -----
&apos;); //loop iterate over multimap for (String lastName: multimap.keySet()) { //printing key and values System.out.println(lastName + &apos;: &apos; + multimap.get(lastName)); } } } </collection></map.entry<k,></k,>

Вихід:

 ----- Printing Multimap using keySet ----- a: [Andrew] b: [Albert, Tom] d: [Sam, Reo] g: [Jack, David] 

Використання Google Guava Library

Multimap інтерфейс визначено в com.google.common.collect пакет бібліотеки Guava. Він реалізує багато класів із такими іменами:

ArrayListMultimap, ForwardingListMultimap, ForwardingMultimap, ForwardingSetMultimap, ForwardingSortedSetMultimap, HashMultimap, ImmutableListMultimap, ImmutableMultimap, ImmutableSetMultimap, LinkedHashMultimap, LinkedListMultimap, TreeMultimap.

код abs c

Синтаксис:

 @GwtCompatible public interface Multimap 

Колекція, яка зіставляє ключі зі значеннями (так само, як у Map), але кожен ключ може бути пов’язаний з кількома значеннями. Ми можемо візуалізувати вміст мультикарти як карту від ключів до непорожніх колекцій значень. Наприклад:

  • X → 1, 2
  • Y → 3

або

  • X → 1
  • X → 2
  • Y → 3

Методи інтерфейсу Java Multimap

метод опис
asMap() Він повертає перегляд цього мультивідображення як карти від кожного окремого ключа до непорожньої колекції пов’язаних значень цього ключа.
очистити() Він видаляє всі пари ключ-значення з мультивідображення, залишаючи його порожнім.
міститьEntry(ключ об'єкта, значення об'єкта) Він повертає true, якщо це мультивідображення містить принаймні одну пару ключ-значення з ключем і значенням.
містить ключ (ключ об'єкта) Він повертає true, якщо це мультивідображення містить принаймні одну пару ключ-значення з ключем.
containsValue(значення об'єкта) Повертає true, якщо це мультивідображення містить принаймні одну пару ключ-значення зі значенням.
записи () Він повертає колекцію подання всіх пар ключ-значення, що містяться в цьому мультивідображенні, як екземпляри Map.Entry.
дорівнює (Object obj) Він порівнює вказаний об’єкт із цим мультивідображенням на рівність.
forEach(дія BiConsumer) Він виконує задану дію для всіх пар ключ-значення, що містяться в цьому мультивідображенні.
отримати (клавіша K) Він повертає колекцію представлень значень, пов’язаних із ключем у цьому мультивідображенні, якщо такі є.
hashCode() Він повертає хеш-код для цього мультивідображення.
пусто() Він повертає true, якщо це мультивідображення не містить пар ключ-значення.
ключі() Він повертає колекцію представлень, що містить ключ від кожної пари ключ-значення в цьому мультивідображенні, без згортання дублікатів.
keySet() Він повертає колекцію переглядів усіх окремих ключів, що містяться в цьому мультивідображенні.
поставити (ключ K, значення V) Зберігає пару ключ-значення в цьому мультивідображенні.
putAll(ключ K, ітеровані значення) Він зберігає пару ключ-значення в цьому мультивідображенні для кожного зі значень, використовуючи той самий ключ, ключ.
putAll(Multimap multimap) Він зберігає всі пари ключ-значення мультивідображення в цьому мультивідображенні в порядку, який повертає multimap.entries().
видалити (ключ об'єкта, значення об'єкта) Він видаляє одну пару ключ-значення з ключем і значенням із цього мультивідображення, якщо таке існує.
removeAll (об'єктний ключ) Він видаляє всі значення, пов’язані з ключем.
replaceValues(ключ K, ітеровані значення) Він зберігає колекцію значень з тим самим ключем, замінюючи будь-які існуючі значення для цього ключа.
розмір() Він повертає кількість пар ключ-значення в цьому мультивідображенні.
значення() Він повертає колекцію представлень, що містить значення з кожної пари ключ-значення, що міститься в цьому мультивідображенні, без згортання дублікатів (тому values().size() == size()).