logo

Java 8 multimap

Java giver forskellige nyttige indbyggede samlingsbiblioteker. Men nogle gange krævede vi specielle typer samlinger, der ikke er indbygget i Javas standardbibliotek. En af denne samling er Multimap . I dette afsnit lærer vi, hvad der er multimap og hvordan man implementerer multimap i Java, og Multimap-grænseflade fra Guava-biblioteket.

Java Multimap

I Java, Kort er en datastruktur, der giver os mulighed for at kortlægge nøgle til værdi. På den anden side er multimap en ny samlingstype fundet i Guava-biblioteket, der tillader kortlægning af en enkelt nøgle til flere værdier (som en-til-mange-relationer i DBMS). Men bemærk at JDK ikke tillader multimapping.

Java 8 multimap

Den alternative løsning til at implementere multimap i Java ved at bruge Googles Guava-bibliotek og Apache Commons Collections-biblioteker. Begge giver en implementering af Multimap-grænsefladen. Den kan gemme mere end én værdi mod en enkelt nøgle. Både nøgler og værdier gemt i samlingen og betragtet som et alternativ til Kort eller Kort (standard JDK Collections Framework).

git push-kommando

Men at bruge Multimap af Googles Guava-bibliotek er ikke meget nyttigt for os. I stedet vil vi implementere vores egen Multimap-klasse i Java, som også kan tilpasses derefter. Det er nemt at skrive en Multimap-klasse i Java.

Det følgende Java-program viser implementeringen af ​​Multimap-klassen i Java ved hjælp af Kort og samling.

Java Multimap Implementering

MultimapExample.java

streng til int 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] 

Brug af Googles Guava-bibliotek

Multimap grænsefladen er defineret i com.google.common.collect pakke fra Guava-biblioteket. Det implementerer mange klasser navngivet som følger:

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

Syntaks:

 @GwtCompatible public interface Multimap 

En samling, der knytter nøgler til værdier (det samme som i Map), men hver nøgle kan være forbundet med flere værdier. Vi kan visualisere indholdet af et multimap enten som et kort fra nøgler til ikke-tomme samlinger af værdier. For eksempel:

xor c++
  • X → 1, 2
  • Y → 3

eller

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

Java Multimap Interface Metoder

Metode Beskrivelse
asMap() Det returnerer en visning af dette multimap som et kort fra hver enkelt nøgle til den ikke-tomme samling af den nøgles tilknyttede værdier.
klar() Det fjerner alle nøgleværdi-par fra multimap'et og efterlader det tomt.
containsEntry(Objektnøgle, Objektværdi) Det returnerer sandt, hvis dette multimap indeholder mindst ét ​​nøgle-værdi-par med nøglen og værdien.
containsKey(Objektnøgle) Det returnerer sandt, hvis dette multimap indeholder mindst ét ​​nøgle-værdi-par med nøglen.
indeholderVærdi(objektværdi) Det Returnerer sandt, hvis dette multimap indeholder mindst ét ​​nøgle-værdi-par med værdien.
indgange() Det returnerer en visningssamling af alle nøgleværdi-par indeholdt i dette multimap, som Map.Entry-forekomster.
er lig med (Objekt obj) Den sammenligner det angivne objekt med dette multimap for lighed.
forEach(BiConsumer action) Den udfører den givne handling for alle nøgleværdi-par indeholdt i dette multimap.
få (K-tast) Det returnerer en visningssamling af værdierne forbundet med nøglen i denne multimap, hvis nogen.
hashCode() Det returnerer hash-koden for dette multimap.
er tom() Det returnerer sandt, hvis dette multimap ikke indeholder nøgle-værdi-par.
nøgler() Det returnerer en visningssamling, der indeholder nøglen fra hvert nøgle-værdi-par i denne multimap, uden at skjule dubletter.
keySet() Det returnerer en visningssamling af alle særskilte nøgler indeholdt i denne multimap.
put (K-tast, V-værdi) Gemmer et nøgle-værdi-par i dette multimap.
putAll(K-tast, Iterable værdier) Den gemmer et nøgle-værdi-par i dette multimap for hver af værdierne, alle ved hjælp af den samme nøgle, nøgle.
putAll(Multimap multimap) Den gemmer alle nøgleværdi-par af multimap i denne multimap, i den rækkefølge, der returneres af multimap.entries().
fjern (objektnøgle, objektværdi) Det fjerner et enkelt nøgle-værdi-par med nøglen og værdien fra dette multimap, hvis et sådant findes.
removeAll(Objektnøgle) Det fjerner alle værdier forbundet med nøglen.
replaceValues(K nøgle, Iterable værdier) Den gemmer en samling af værdier med den samme nøgle, og erstatter eventuelle eksisterende værdier for den pågældende nøgle.
størrelse() Det returnerer antallet af nøgle-værdi-par i dette multimap.
værdier() Det returnerer en visningssamling, der indeholder værdien fra hvert nøgle-værdi-par, der er indeholdt i dette multimap, uden at skjule dubletter (så værdier().size() == størrelse()).