logo

Java 8 Multimap

A Java különféle hasznos beépített gyűjteménykönyvtárakat biztosít. De néha különleges típusú gyűjteményekre volt szükségünk, amelyek nincsenek beépítve a Java szabványos könyvtárába. Ennek a gyűjteménynek az egyike a Multimap . Ebben a részben megtudjuk, mi a multimap és hogyan lehet multimap-et implementálni Java-ban, és a Multimap interfész a Guava könyvtárból.

Java Multimap

Java nyelven, Térkép egy olyan adatstruktúra, amely lehetővé teszi számunkra, hogy a kulcsot értékre leképezzük. Másrészt a multimap a Guava könyvtárban található új gyűjteménytípus, amely lehetővé teszi egyetlen kulcs több értékhez való hozzárendelését (például egy-a-többhöz relációkat a DBMS-ben). De vegye figyelembe, hogy a JDK nem teszi lehetővé a többleképezést.

Java 8 Multimap

Alternatív megoldás a multimap megvalósítására Java nyelven a Google Guava könyvtárának és az Apache Commons Collections könyvtárainak használatával. Mindkettő a Multimap interfész megvalósítását biztosítja. Egy kulcshoz több értéket is képes tárolni. Mind a kulcsok, mind a gyűjteményben tárolt értékek, amelyek alternatívájaként tekinthetők Térkép vagy Térkép (standard JDK Collections Framework).

Neena Gupta

A Google Guava könyvtárának Multimap használata azonban nem sokat segít számunkra. Ehelyett saját Multimap osztályunkat fogjuk megvalósítani Java nyelven, amely szintén ennek megfelelően testreszabható. Java nyelven könnyű Multimap osztályt írni.

A következő Java program a Multimap osztály megvalósítását mutatja be Java nyelven Map and collection használatával.

Java Multimap megvalósítás

MultimapExample.java

blokkolja a youtube hirdetéseket android
 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,>

Kimenet:

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

A Google Guava Library segítségével

Multimap -ben van meghatározva az interfész com.google.common.collect a Guava könyvtár csomagja. Számos osztályt valósít meg az alábbiak szerint:

ArrayListMultimap, ForwardingListMultimap, ForwardingMultimap, ForwardingSetMultimap, ForwardingSortedSetMultimap, HashMultimap, ImmutableListMultimap, ImmutableMultimap, ImmutableSetMultimap, LinkedHashMultimap, TreistMultimap, Treistimap.

Szintaxis:

 @GwtCompatible public interface Multimap 

Olyan gyűjtemény, amely a kulcsokat értékekhez rendeli hozzá (ugyanúgy, mint a Térképben), de minden kulcshoz több érték is társítható. A multimap tartalmát a kulcsoktól a nem üres értékgyűjteményekig tartó térképként is megjeleníthetjük. Például:

mappa átnevezése linuxban
  • X → 1, 2
  • I → 3

vagy

  • X → 1
  • X → 2
  • I → 3

Java Multimap interfész módszerek

Módszer Leírás
asMap() A többleképezés nézetét minden egyes kulcshoz tartozó leképezésként adja vissza az adott kulcshoz tartozó értékek nem üres gyűjteményéhez.
egyértelmű() Eltávolítja az összes kulcs-érték párt a többleképezésből, és üresen hagyja.
tartalmazza Entry (objektumkulcs, objektumérték) Igazat ad vissza, ha ez a többleképezés legalább egy kulcs-érték párt tartalmaz a kulccsal és az értékkel.
includeKey (objektumkulcs) Igazat ad vissza, ha ez a többleképezés legalább egy kulcs-érték párt tartalmaz a kulccsal.
includeValue (objektumérték) Igaz értéket ad vissza, ha ez a többleképezés legalább egy kulcs-érték párt tartalmaz az értékkel.
bejegyzés() A többleképezésben található összes kulcs-érték pár nézetgyűjteményét adja vissza Map.Entry példányként.
egyenlő (objektum objektum) Az egyenlőség érdekében összehasonlítja a megadott objektumot ezzel a többleképezéssel.
forEach (BiConsumer akció) Az adott műveletet végrehajtja a többleképezésben található összes kulcs-érték párra.
get (K billentyű) A kulcshoz társított értékek nézetgyűjteményét adja vissza ebben a többleképezésben, ha van ilyen.
hash kód() Visszaadja ennek a multimapnek a hash kódját.
üres() Igaz értéket ad vissza, ha ez a többleképezés nem tartalmaz kulcs-érték párokat.
kulcsok() Egy nézetgyűjteményt ad vissza, amely tartalmazza a többleképezésben szereplő minden kulcs-érték pár kulcsát, anélkül, hogy összecsukná az ismétlődéseket.
keySet() Egy nézetgyűjteményt ad vissza az ebben a többleképezésben található összes különálló kulcsból.
put (K kulcs, V érték) Kulcs-érték párt tárol ebben a többleképezésben.
putAll (K kulcs, iterálható értékek) Ebben a többleképezésben egy kulcs-érték párt tárol minden egyes értékhez, mindegyik ugyanazt a kulcsot, kulcsot használja.
putAll (multimap multimap) Ebben a multimapben tárolja a multimap összes kulcs-érték párját, a multimap.entries() által visszaadott sorrendben.
eltávolítás (objektumkulcs, objektumérték) Eltávolít egyetlen kulcs-érték párt a kulccsal és az értékkel ebből a többleképezésből, ha van ilyen.
RemoveAll (Objektumkulcs) Eltávolítja a kulcshoz tartozó összes értéket.
csereértékek (K kulcs, iterálható értékek) Értékek gyűjteményét tárolja ugyanazzal a kulccsal, és lecseréli a kulcshoz tartozó meglévő értékeket.
méret() A kulcs-érték párok számát adja vissza ebben a többleképezésben.
értékek() Egy nézetgyűjteményt ad vissza, amely tartalmazza a többleképezésben található minden kulcs-érték pár értékét, anélkül, hogy összecsukná az ismétlődéseket (tehát értékek().size() == size()).