logo

Java 8 Multimap

Java ponuja različne uporabne vgrajene knjižnice zbirk. Toda včasih smo zahtevali posebno vrsto zbirk, ki niso vgrajene v standardno knjižnico Jave. Eden od te zbirke je Multimap . V tem razdelku bomo izvedeli, kaj je multimap in kako implementirati multimap v Javi, in Multimap vmesnik knjižnice Guava.

Java Multimap

V Javi, Zemljevid je podatkovna struktura, ki nam omogoča preslikavo ključa v vrednost. Po drugi strani pa je multimap nova vrsta zbirke, ki jo najdemo v knjižnici Guava in omogoča preslikavo enega ključa v več vrednosti (kot so razmerja ena proti mnogo v DBMS). Vendar upoštevajte, da JDK ne dovoljuje večkratnega preslikave.

Java 8 Multimap

Alternativna rešitev za implementacijo multimapa v Javi z uporabo Googlove knjižnice Guava in knjižnic Apache Commons Collections. Oba zagotavljata implementacijo vmesnika Multimap. Lahko shrani več kot eno vrednost proti enemu ključu. Tako ključi kot vrednosti, shranjeni v zbirki in obravnavani kot alternativa Zemljevid oz Zemljevid (standardno ogrodje zbirk JDK).

strojno učenje in vrste

Toda uporaba Multimapa Googlove knjižnice Guava nam ni v veliko pomoč. Namesto tega bomo implementirali lasten razred Multimap v Javi, ki ga je mogoče tudi ustrezno prilagoditi. V Javi je enostavno napisati razred Multimap.

Naslednji program Java prikazuje izvedbo razreda Multimap v Javi z uporabo Map in zbirke.

Implementacija Java Multimap

MultimapExample.java

powershell proti 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,>

Izhod:

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

Uporaba Googlove knjižnice Guava

Multimap vmesnik je definiran v com.google.common.collect paket knjižnice Guava. Izvaja številne razrede, imenovane na naslednji način:

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

Sintaksa:

 @GwtCompatible public interface Multimap 

Zbirka, ki preslika ključe v vrednosti (enako kot v Map), vendar je lahko vsak ključ povezan z več vrednostmi. Vsebino multimapa lahko vizualiziramo bodisi kot zemljevid od ključev do nepraznih zbirk vrednosti. Na primer:

singleton design
  • X → 1, 2
  • Y → 3

oz

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

Metode vmesnika Java Multimap

Metoda Opis
asMap() Vrne pogled tega večpreslikave kot preslikave od vsakega posebnega ključa do neprazne zbirke vrednosti, povezanih s tem ključem.
počisti() Z multimapa odstrani vse pare ključ-vrednost in ostane prazen.
containsEntry(ključ predmeta, vrednost predmeta) Vrne true, če ta multimap vsebuje vsaj en par ključ-vrednost s ključem in vrednostjo.
containsKey(ključ predmeta) Vrne true, če ta multimap vsebuje vsaj en par ključ-vrednost s ključem.
containsValue(vrednost predmeta) Vrne true, če ta multimap vsebuje vsaj en par ključ-vrednost z vrednostjo.
vnosi () Vrne zbirko pogledov vseh parov ključ-vrednost, ki jih vsebuje ta multimap, kot primerke Map.Entry.
enako (predmet obj) Navedeni predmet primerja s tem multimapom za enakost.
forEach(dejanje BiConsumer) Izvede dano dejanje za vse pare ključ-vrednost, ki jih vsebuje ta multimap.
pridobi (tipka K) Vrne zbirko pogledov vrednosti, povezanih s ključem v tem večpreslikavi, če obstaja.
hashCode() Vrne zgoščeno kodo za ta multimap.
je prazno() Vrne true, če ta multimap ne vsebuje parov ključ-vrednost.
ključi() Vrne zbirko pogledov, ki vsebuje ključ iz vsakega para ključ-vrednost v tem multimapu, brez strnjenih dvojnikov.
keySet() Vrne zbirko pogledov vseh različnih ključev, ki jih vsebuje ta večpreslikava.
postavi (tipka K, vrednost V) Shrani par ključ-vrednost v tem multimapu.
putAll(tipka K, ponovljive vrednosti) V ta multimap shrani par ključ-vrednost za vsako od vrednosti, pri čemer vse uporabljajo isti ključ, key.
putAll(Multimap multimap) Shrani vse pare ključ-vrednost multimapa v ta multimap v vrstnem redu, ki ga vrne multimap.entries().
odstrani (ključ predmeta, vrednost predmeta) Odstrani en sam par ključ-vrednost s ključem in vrednostjo iz tega večpreslikave, če ta obstaja.
odstraniVse (ključ predmeta) Odstrani vse vrednosti, povezane s ključem.
replaceValues(tipka K, vrednosti, ki jih je mogoče ponoviti) Shranjuje zbirko vrednosti z istim ključem in nadomešča vse obstoječe vrednosti za ta ključ.
velikost () Vrne število parov ključ-vrednost v tem multimapu.
vrednote() Vrne zbirko pogledov, ki vsebuje vrednost iz vsakega para ključ-vrednost, ki ga vsebuje ta multimap, brez strnjenih dvojnikov (torej values().size() == size()).