logo

Java 8 Multimap

Java poskytuje rôzne užitočné vstavané knižnice kolekcií. Niekedy sme však požadovali špeciálny typ kolekcií, ktoré nie sú zabudované v štandardnej knižnici Java. Jednou z tejto kolekcie je Multimapa . V tejto časti sa dozvieme, čo je multimapa a ako implementovať multimapu v Jave, a Multimapové rozhranie z knižnice Guava.

Java Multimap

v Jave Mapa je dátová štruktúra, ktorá nám umožňuje mapovať kľúč k hodnote. Na druhej strane, multimap je nový typ kolekcie nájdený v knižnici Guava, ktorý umožňuje mapovanie jedného kľúča na viacero hodnôt (ako napríklad vzťahy one-to-many v DBMS). Ale všimnite si, že JDK neumožňuje multimapovanie.

Java 8 Multimap

Alternatívne riešenie na implementáciu multimáp v jazyku Java pomocou knižnice Guava spoločnosti Google a knižníc Apache Commons Collections. Oba poskytujú implementáciu rozhrania Multimap. Môže uložiť viac ako jednu hodnotu oproti jednému kľúču. Kľúče aj hodnoty uložené v kolekcii a považované za alternatívu k Mapa alebo Mapa (štandardný rámec kolekcií JDK).

príklad java mapy

Ale používanie Multimap knižnice Guava spoločnosti Google nie je pre nás veľmi užitočné. Namiesto toho implementujeme našu vlastnú triedu Multimap v jazyku Java, ktorú je možné zodpovedajúcim spôsobom prispôsobiť. Je ľahké napísať triedu Multimap v jazyku Java.

Nasledujúci program Java zobrazuje implementáciu triedy Multimap v jazyku Java pomocou mapy a kolekcie.

Implementácia Java Multimap

MultimapExample.java

powershell vs bash
 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ýkon:

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

Používanie knižnice Guava od Google

Multimapa rozhranie je definované v com.google.common.collect balík knižnice Guava. Implementuje mnoho tried pomenovaných takto:

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

Syntax:

 @GwtCompatible public interface Multimap 

Kolekcia, ktorá mapuje kľúče na hodnoty (rovnaké ako v Mape), ale každý kľúč môže byť priradený k viacerým hodnotám. Obsah multimapy môžeme vizualizovať buď ako mapu od kľúčov po neprázdne kolekcie hodnôt. Napríklad:

zoznam triedený java
  • X → 1, 2
  • Y → 3

alebo

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

Metódy rozhrania Java Multimap

Metóda Popis
asMap() Vracia pohľad na túto multimapu ako mapu z každého odlišného kľúča do neprázdnej kolekcie hodnôt súvisiacich s týmto kľúčom.
jasný() Z multimapy sa odstránia všetky páry kľúč – hodnota a zostane prázdna.
obsahujeEntry (kľúč objektu, hodnota objektu) Vráti hodnotu true, ak táto multimapa obsahuje aspoň jeden pár kľúč – hodnota s kľúčom a hodnotou.
obsahuje kľúč (kľúč objektu) Vráti hodnotu true, ak táto multimapa obsahuje aspoň jeden pár kľúč – hodnota s kľúčom.
obsahujeValue(hodnota objektu) Vráti hodnotu true, ak táto multimapa obsahuje aspoň jeden pár kľúč – hodnota s hodnotou.
záznamy() Vráti kolekciu zobrazenia všetkých párov kľúč – hodnota obsiahnutých v tejto multimape ako inštancie Map.Entry.
rovná sa (objekt objektu) Porovnáva zadaný objekt s touto multimapou kvôli rovnosti.
pre každého (akcia pre dvoch spotrebiteľov) Vykoná danú akciu pre všetky páry kľúč – hodnota obsiahnuté v tejto multimape.
dostať (kláves K) Vráti kolekciu zobrazení hodnôt spojených s kľúčom v tejto multimape, ak nejaké existujú.
hashCode() Vráti hash kód pre túto multimapu.
je prázdny() Ak táto multimapa neobsahuje žiadne páry kľúč – hodnota, vráti hodnotu true.
kľúče () Vráti kolekciu pohľadov obsahujúcu kľúč z každého páru kľúč – hodnota v tejto multimape bez toho, aby došlo k zbaleniu duplikátov.
keySet() Vráti kolekciu pohľadov všetkých odlišných kľúčov obsiahnutých v tejto multimape.
put (kľúč K, hodnota V) Uloží pár kľúč – hodnota do tejto multimapy.
putAll (kľúč K, opakovateľné hodnoty) V tejto multimape ukladá pár kľúč – hodnota pre každú hodnotu, pričom všetky používajú rovnaký kľúč, kľúč.
putAll(Multimap multimap) Ukladá všetky páry kľúč-hodnota multimap v tejto multimape v poradí vrátenom multimap.entries().
odstrániť (kľúč objektu, hodnota objektu) Z tejto multimapy odstráni jeden pár kľúč – hodnota s kľúčom a hodnotou, ak taký existuje.
removeAll (kľúč objektu) Odstráni všetky hodnoty spojené s kľúčom.
nahradiťHodnoty (kľúč K, opakovateľné hodnoty) Ukladá kolekciu hodnôt s rovnakým kľúčom a nahrádza všetky existujúce hodnoty tohto kľúča.
veľkosť () Vráti počet párov kľúč – hodnota v tejto multimape.
hodnoty() Vráti kolekciu pohľadov obsahujúcu hodnotu z každého páru kľúč – hodnota obsiahnutý v tejto multimape bez zbalenia duplikátov (takže values().size() == size()).