logo

Java 8 Multimap

Java biedt verschillende nuttige ingebouwde verzamelingsbibliotheken. Maar soms hadden we een speciaal type collecties nodig die niet in de standaardbibliotheek van Java zijn ingebouwd. Eén van deze collecties is de Multikaart . In dit gedeelte zullen we leren wat multimap en hoe multimap in Java te implementeren, en de Multimap-interface van de Guava-bibliotheek.

Java-multimap

Op Java, Kaart is een datastructuur waarmee we sleutel aan waarde kunnen koppelen. Aan de andere kant is multimap een nieuw verzamelingstype dat wordt aangetroffen in de Guava-bibliotheek en waarmee een enkele sleutel aan meerdere waarden kan worden toegewezen (zoals één-op-veel-relaties in DBMS). Maar houd er rekening mee dat JDK multimapping niet toestaat.

Java 8 Multimap

De alternatieve oplossing om multimap in Java te implementeren door gebruik te maken van de Guava-bibliotheek van Google en de Apache Commons Collections-bibliotheken. Beide bieden een implementatie van de Multimap-interface. Het kan meer dan één waarde opslaan voor één enkele sleutel. Zowel de sleutels als de waarden die in de verzameling zijn opgeslagen en als alternatief worden beschouwd Kaart of Kaart (standaard JDK Collections Framework).

nieuwe lijnpython

Maar het gebruik van Multimap uit de Guava-bibliotheek van Google heeft voor ons niet veel nut. In plaats daarvan zullen we onze eigen Multimap-klasse in Java implementeren, die ook dienovereenkomstig kan worden aangepast. Het is gemakkelijk om een ​​Multimap-klasse in Java te schrijven.

Het volgende Java-programma toont de implementatie van de Multimap-klasse in Java met behulp van Map en collection.

Java Multimap-implementatie

MultimapExample.java

string naar int in 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,>

Uitgang:

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

Met behulp van de Guava-bibliotheek van Google

Multikaart interface is gedefinieerd in com.google.common.collect pakket van de Guava-bibliotheek. Het implementeert vele klassen die als volgt worden genoemd:

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

Syntaxis:

 @GwtCompatible public interface Multimap 

Een verzameling die sleutels aan waarden toewijst (hetzelfde als in Map), maar elke sleutel kan aan meerdere waarden zijn gekoppeld. We kunnen de inhoud van een multimap visualiseren als een kaart van sleutels naar niet-lege verzamelingen waarden. Bijvoorbeeld:

c++ prototypefunctie
  • X → 1, 2
  • J → 3

of

  • X → 1
  • X → 2
  • J → 3

Java Multimap Interface-methoden

Methode Beschrijving
asMap() Het retourneert een weergave van deze multimap als een kaart van elke afzonderlijke sleutel naar de niet-lege verzameling van de bijbehorende waarden van die sleutel.
duidelijk() Het verwijdert alle sleutel-waardeparen uit de multimap, waardoor deze leeg blijft.
bevatEntry(Objectsleutel, Objectwaarde) Het retourneert waar als deze multimap ten minste één sleutel-waardepaar bevat met de sleutel en de waarde.
bevatsleutel(Objectsleutel) Het retourneert waar als deze multimap ten minste één sleutelwaardepaar met de sleutel bevat.
bevatWaarde(Objectwaarde) Het retourneert waar als deze multimap ten minste één sleutelwaardepaar met de waarde bevat.
vermeldingen() Het retourneert een weergaveverzameling van alle sleutel-waardeparen in deze multimap, als Map.Entry-instanties.
is gelijk aan(Objectobject) Het vergelijkt het opgegeven object met deze multimap op gelijkheid.
forEach(BiConsumer-actie) Het voert de gegeven actie uit voor alle sleutel-waardeparen in deze multimap.
krijgen (K-toets) Het retourneert een weergaveverzameling van de waarden die zijn gekoppeld aan de sleutel in deze multimap, indien aanwezig.
hashCode() Het retourneert de hashcode voor deze multimap.
is leeg() Het retourneert waar als deze multimap geen sleutel-waardeparen bevat.
sleutels() Het retourneert een weergaveverzameling met de sleutel van elk sleutelwaardepaar in deze multimap, zonder duplicaten samen te vouwen.
sleutelbos() Het retourneert een weergaveverzameling van alle afzonderlijke sleutels in deze multimap.
put(K-sleutel, V-waarde) Slaat een sleutel-waardepaar op in deze multimap.
putAll(K-sleutel, itereerbare waarden) Het slaat een sleutel-waardepaar op in deze multimap voor elk van de waarden, allemaal met dezelfde sleutel.
putAll(Multimap-multimap) Het slaat alle sleutel-waardeparen van multimap op in deze multimap, in de volgorde die wordt geretourneerd door multimap.entries().
remove(Objectsleutel, Objectwaarde) Het verwijdert een enkel sleutel-waardepaar met de sleutel en de waarde uit deze multimap, als deze bestaat.
removeAll(Objectsleutel) Het verwijdert alle waarden die aan de sleutel zijn gekoppeld.
ReplaceValues(K-sleutel, itereerbare waarden) Het slaat een verzameling waarden op met dezelfde sleutel en vervangt alle bestaande waarden voor die sleutel.
maat() Het retourneert het aantal sleutelwaardeparen in deze multimap.
waarden() Het retourneert een weergaveverzameling die de waarde bevat van elk sleutel-waardepaar in deze multimap, zonder duplicaten samen te vouwen (dus waarden().size() == size()).