logo

Java 8 Multimap

Java gir ulike nyttige innebygde samlingsbiblioteker. Men noen ganger krevde vi spesiell type samlinger som ikke er innebygd i Javas standardbibliotek. En av denne samlingen er Multimap . I denne delen skal vi lære hva som er multimap og hvordan implementere multimap i Java, og Multimap-grensesnitt fra Guava-biblioteket.

Java Multimap

I Java, Kart er en datastruktur som lar oss kartlegge nøkkel til verdi. På den annen side er multimap en ny samlingstype som finnes i Guava-biblioteket som tillater kartlegging av en enkelt nøkkel til flere verdier (som en-til-mange-relasjoner i DBMS). Men merk at JDK ikke tillater multimapping.

Java 8 Multimap

Den alternative løsningen for å implementere multimap i Java ved å bruke Googles Guava-bibliotek og Apache Commons Collections-biblioteker. Begge gir en implementering av Multimap-grensesnittet. Den kan lagre mer enn én verdi mot en enkelt nøkkel. Både nøklene og verdiene som er lagret i samlingen og vurdert som et alternativ til Kart eller Kart (standard JDK Collections Framework).

j e s t

Men å bruke Multimap av Googles Guava-bibliotek er ikke mye nyttig for oss. I stedet vil vi implementere vår egen Multimap-klasse i Java som også kan tilpasses deretter. Det er enkelt å skrive en Multimap-klasse i Java.

Følgende Java-program viser implementeringen av Multimap-klassen i Java ved hjelp av Kart og samling.

Java Multimap-implementering

MultimapExample.java

bytte tilfelle 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,>

Produksjon:

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

Bruker Googles Guava-bibliotek

Multimap grensesnitt er definert i com.google.common.collect pakken til Guava-biblioteket. Den implementerer mange klasser navngitt som følger:

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

Syntaks:

 @GwtCompatible public interface Multimap 

En samling som tilordner nøkler til verdier (det samme som i kart), men hver nøkkel kan være assosiert med flere verdier. Vi kan visualisere innholdet i et multimap enten som et kart fra nøkler til ikke-tomme verdisamlinger. For eksempel:

rekke strenger i c-programmering
  • X → 1, 2
  • Y → 3

eller

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

Java Multimap-grensesnittmetoder

Metode Beskrivelse
asMap() Den returnerer en visning av dette multikartet som et kart fra hver distinkte nøkkel til den ikke-tomme samlingen av den nøkkelens tilknyttede verdier.
klar() Den fjerner alle nøkkelverdi-par fra multikartet, og lar det stå tomt.
containsEntry(Objektnøkkel, Objektverdi) Det returnerer sant hvis dette multikartet inneholder minst ett nøkkel-verdi-par med nøkkelen og verdien.
containsKey(Objektnøkkel) Det returnerer sant hvis dette multikartet inneholder minst ett nøkkelverdi-par med nøkkelen.
containsValue(Objektverdi) Det Returnerer sant hvis dette multikartet inneholder minst ett nøkkelverdi-par med verdien.
innganger() Den returnerer en visningssamling av alle nøkkelverdi-parene i dette multikartet, som Map.Entry-forekomster.
lik (Objekt objekt) Den sammenligner det angitte objektet med dette multikartet for likhet.
forEach(BiConsumer action) Den utfører den gitte handlingen for alle nøkkelverdi-parene i dette multikartet.
få (K-tast) Den returnerer en visningssamling av verdiene knyttet til nøkkelen i denne multimap hvis noen.
hashkode() Den returnerer hash-koden for dette multikartet.
er tom() Det returnerer sant hvis dette multikartet ikke inneholder noen nøkkelverdi-par.
nøkler() Den returnerer en visningssamling som inneholder nøkkelen fra hvert nøkkelverdi-par i dette multikartet, uten å skjule duplikater.
keySet() Den returnerer en visningssamling av alle distinkte nøkler i dette multikartet.
put(K-tast, V-verdi) Lagrer et nøkkelverdi-par i dette multikartet.
putAll(K-tast, Iterable verdier) Den lagrer et nøkkelverdi-par i dette multikartet for hver av verdiene, som alle bruker samme nøkkel, nøkkel.
putAll(Multimap multimap) Den lagrer alle nøkkelverdi-par av multimap i dette multimap, i rekkefølgen returnert av multimap.entries().
fjern (objektnøkkel, objektverdi) Den fjerner et enkelt nøkkelverdi-par med nøkkelen og verdien fra dette multikartet, hvis det finnes.
removeAll(Objektnøkkel) Den fjerner alle verdier knyttet til nøkkelen.
replaceValues(K-nøkkel, Iterable verdier) Den lagrer en samling verdier med samme nøkkel, og erstatter eventuelle eksisterende verdier for den nøkkelen.
størrelse() Den returnerer antall nøkkelverdi-par i dette multikartet.
verdier() Den returnerer en visningssamling som inneholder verdien fra hvert nøkkelverdi-par i dette multikartet, uten å skjule duplikater (så values().size() == size()).