logo

Java 8 Multimap

Java poskytuje různé užitečné vestavěné knihovny kolekcí. Ale někdy jsme požadovali speciální typ kolekcí, které nejsou vestavěny ve standardní knihovně Java. Jednou z této kolekce je Multimapa . V této části se naučíme, co je multimapa a jak implementovat multimapu v Javě, a Multimapové rozhraní z knihovny Guava.

Java Multimap

v Javě, Mapa je datová struktura, která nám umožňuje mapovat klíč k hodnotě. Na druhou stranu, multimap je nový typ kolekce nalezený v knihovně Guava, který umožňuje mapování jednoho klíče na více hodnot (jako vztahy one-to-many v DBMS). Ale všimněte si, že JDK neumožňuje multimapping.

Java 8 Multimap

Alternativní řešení pro implementaci multimap v Javě pomocí knihovny Guava společnosti Google a knihoven Apache Commons Collections. Oba poskytují implementaci rozhraní Multimap. Může uložit více než jednu hodnotu proti jednomu klíči. Jak klíče, tak hodnoty uložené v kolekci a považované za alternativu k Mapa nebo Mapa (standardní rámec JDK Collections).

java kódování if else příkaz

Ale použití Multimap knihovny Guava společnosti Google pro nás není příliš užitečné. Místo toho implementujeme naši vlastní třídu Multimap v Javě, kterou lze také odpovídajícím způsobem upravit. V Javě je snadné napsat třídu Multimap.

Následující program Java znázorňuje implementaci třídy Multimap v jazyce Java pomocí Map a kolekce.

Implementace Java Multimap

MultimapExample.java

pole v Javě
 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,>

Výstup:

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

Pomocí knihovny Guava od Googlu

Multimapa rozhraní je definováno v com.google.common.collect balíček knihovny Guava. Implementuje mnoho tříd pojmenovaných takto:

ArrayListMultimap, ForwardingListMultimap, ForwardingMultimap, ForwardingSetMultimap, ForwardingSortedSetMultimap, HashMultimap, ImmutableListMultimap, ImmutableMultimap, ImmutableSetMultimap, LinkedHashMultimap, LinkedHashMultiM Trem

Syntax:

zeenat aman herec
 @GwtCompatible public interface Multimap 

Kolekce, která mapuje klíče na hodnoty (stejné jako v Mapě), ale každý klíč může být spojen s více hodnotami. Obsah multimapy můžeme vizualizovat buď jako mapu od klíčů po neprázdné kolekce hodnot. Například:

  • X → 1, 2
  • Y → 3

nebo

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

Metody rozhraní Java Multimap

Metoda Popis
asMap() Vrátí pohled na tuto multimapu jako mapu z každého odlišného klíče do neprázdné kolekce přidružených hodnot tohoto klíče.
Průhledná() Odstraní všechny páry klíč–hodnota z multimapy a ponechá ji prázdnou.
obsahujeEntry (klíč objektu, hodnota objektu) Vrací hodnotu true, pokud tato multimapa obsahuje alespoň jeden pár klíč–hodnota s klíčem a hodnotou.
obsahuje klíč (objektový klíč) Vrací hodnotu true, pokud tato multimapa obsahuje alespoň jeden pár klíč–hodnota s klíčem.
obsahujeValue(hodnota objektu) Vrací hodnotu true, pokud tato multimapa obsahuje alespoň jeden pár klíč–hodnota s hodnotou.
záznamy() Vrátí kolekci zobrazení všech párů klíč-hodnota obsažených v této multimapě jako instance Map.Entry.
rovná se (objekt objektu) Porovnává zadaný objekt s touto multimapou pro dosažení rovnosti.
pro každého (akce BiConsumer) Provede danou akci pro všechny páry klíč–hodnota obsažené v této multimapě.
získat (klávesa K) Vrátí kolekci zobrazení hodnot spojených s klíčem v této multimapě, pokud existují.
hashCode() Vrátí hash kód pro tuto multimapu.
je prázdný() Pokud tato multimapa neobsahuje žádné páry klíč–hodnota, vrátí hodnotu true.
klíče() Vrátí kolekci zobrazení obsahující klíč z každého páru klíč–hodnota v této multimapě, aniž by došlo ke sbalení duplikátů.
keySet() Vrátí kolekci zobrazení všech odlišných klíčů obsažených v této multimapě.
put (klíč K, hodnota V) Uloží pár klíč–hodnota do této multimapy.
putAll (klíč K, opakovatelné hodnoty) Ukládá pár klíč-hodnota v této multimapě pro každou z hodnot, všechny používají stejný klíč, klíč.
putAll(Multimap multimap) Ukládá všechny páry klíč-hodnota multimap v této multimapě v pořadí vráceném multimap.entries().
odstranit (klíč objektu, hodnota objektu) Odebere jeden pár klíč–hodnota s klíčem a hodnotou z této multimapy, pokud takový existuje.
odstranit vše (klíč objektu) Odebere všechny hodnoty spojené s klíčem.
nahraditHodnoty (klíč K, opakovatelné hodnoty) Ukládá kolekci hodnot se stejným klíčem a nahrazuje všechny existující hodnoty tohoto klíče.
velikost() Vrátí počet párů klíč–hodnota v této multimapě.
hodnoty() Vrátí kolekci zobrazení obsahující hodnotu z každého páru klíč–hodnota obsaženého v této multimapě, aniž by došlo ke sbalení duplikátů (takže values().size() == size()).