logo

Java 8 Multimap

Java tillhandahåller olika användbara inbyggda samlingsbibliotek. Men ibland krävde vi speciell typ av samlingar som inte är inbyggda i Javas standardbibliotek. En av dessa samlingar är Multimap . I det här avsnittet kommer vi att lära oss vad som är multimap och hur man implementerar multimap i Java, och den Multimap-gränssnitt från Guava-biblioteket.

Java Multimap

I Java, Karta är en datastruktur som gör att vi kan mappa nyckel till värde. Å andra sidan är multimap en ny samlingstyp som finns i Guava-biblioteket som tillåter mappning av en enda nyckel till flera värden (som en-till-många-relationer i DBMS). Men observera att JDK inte tillåter multimapping.

Java 8 Multimap

Den alternativa lösningen för att implementera multimap i Java genom att använda Googles Guava-bibliotek och Apache Commons Collections-bibliotek. Båda tillhandahåller en implementering av Multimap-gränssnittet. Den kan lagra mer än ett värde mot en enda nyckel. Både nycklar och värden lagras i samlingen och betraktas som ett alternativ till Karta eller Karta (standard JDK Collections Framework).

Rajinikanth

Men att använda Multimap av Googles Guava-bibliotek är inte mycket användbart för oss. Istället kommer vi att implementera vår egen Multimap-klass i Java som också kan anpassas därefter. Det är lätt att skriva en Multimap-klass i Java.

Följande Java-program visar implementeringen av Multimap-klassen i Java med hjälp av Map and collection.

Java Multimap-implementering

MultimapExample.java

en array i java
 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,>

Produktion:

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

Använder Googles Guava Library

Multimap gränssnittet definieras i com.google.common.collect paketet från Guava-biblioteket. Den implementerar många klasser som heter enligt följande:

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

Syntax:

 @GwtCompatible public interface Multimap 

En samling som mappar nycklar till värden (samma som i Map) men varje nyckel kan vara associerad med flera värden. Vi kan visualisera innehållet i en multimap antingen som en karta från nycklar till icke-tomma samlingar av värden. Till exempel:

slumpmässigt c
  • X → 1, 2
  • Y → 3

eller

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

Java Multimap-gränssnittsmetoder

Metod Beskrivning
asMap() Den returnerar en vy av denna multimap som en karta från varje distinkt nyckel till den icke-tomma samlingen av den nyckelns associerade värden.
klar() Den tar bort alla nyckel-värdepar från multimapen och lämnar den tom.
containsEntry(Objektnyckel, Objektvärde) Den returnerar sant om denna multimap innehåller minst ett nyckel-värdepar med nyckeln och värdet.
containsKey(Objektnyckel) Den returnerar sant om denna multimap innehåller minst ett nyckel-värdepar med nyckeln.
innehållerValue(Objektvärde) Det Returnerar sant om denna multimap innehåller minst ett nyckel-värdepar med värdet.
poster() Den returnerar en vysamling av alla nyckel-värdepar som finns i denna multimap, som Map.Entry-instanser.
lika (Objekt objekt) Den jämför det angivna objektet med denna multimap för jämlikhet.
forEach(BiConsumer action) Den utför den givna åtgärden för alla nyckel-värdepar som finns i denna multimap.
få (K-nyckel) Den returnerar en vysamling av värdena som är associerade med nyckeln i denna multimap om några.
hash-kod() Den returnerar hash-koden för denna multimap.
är tom() Den returnerar sant om denna multimap inte innehåller några nyckel-värdepar.
nycklar() Den returnerar en vysamling som innehåller nyckeln från varje nyckel-värdepar i denna multimap, utan att kollapsa dubbletter.
keySet() Den returnerar en vysamling av alla distinkta nycklar som finns i denna multimap.
put(K-nyckel, V-värde) Lagrar ett nyckel-värdepar i denna multimap.
putAll(K-nyckel, Iterable värden) Den lagrar ett nyckel-värdepar i denna multimap för vart och ett av värdena, alla med samma nyckel, nyckel.
putAll(Multimap multimap) Den lagrar alla nyckel-värdepar av multimap i denna multimap, i den ordning som returneras av multimap.entries().
remove(Objektnyckel, Objektvärde) Den tar bort ett enskilt nyckel-värdepar med nyckeln och värdet från denna multimap, om sådana finns.
removeAll(Objektnyckel) Den tar bort alla värden som är associerade med nyckeln.
replaceValues(K-nyckel, Iterable värden) Den lagrar en samling värden med samma nyckel och ersätter alla befintliga värden för den nyckeln.
storlek() Den returnerar antalet nyckel-värdepar i denna multimap.
värden() Den returnerar en vysamling som innehåller värdet från varje nyckel-värdepar som finns i denna multimap, utan att komprimera dubbletter (så values().size() == size()).