Java oferă diverse biblioteci utile de colecții încorporate. Dar uneori aveam nevoie de un tip special de colecții care nu sunt încorporate în biblioteca standard Java. Una dintre aceste colecții este Multihartă . În această secțiune, vom afla ce este multimap și cum se implementează multimap în Java, si Interfață cu mai multe hărți a bibliotecii Guava.
Java Multimap
În Java, Hartă este o structură de date care ne permite să mapam cheia la valoare. Pe de altă parte, multimap este un nou tip de colecție găsit în biblioteca Guava care permite maparea unei singure chei la mai multe valori (cum ar fi relațiile unu-la-mai multe în DBMS). Dar rețineți că JDK nu permite multimapping.
Soluția alternativă pentru implementarea multimap în Java utilizând biblioteca Google Guava și bibliotecile Apache Commons Collections. Ambele oferă o implementare a interfeței Multimap. Poate stoca mai mult de o valoare pentru o singură cheie. Atât cheile, cât și valorile stocate în colecție și considerate ca o alternativă la Hartă
limbaj groovy
Dar utilizarea Multimap a bibliotecii Google Guava nu este de mare ajutor pentru noi. În schimb, vom implementa propria noastră clasă Multimap în Java, care poate fi, de asemenea, personalizată în consecință. Este ușor să scrieți o clasă Multimap în Java.
Următorul program Java descrie implementarea clasei Multimap în Java folosind Map și colecția.
Implementare Java Multimap
MultimapExample.java
powershell vs bash
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>> 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('a', 'Andrew'); multimap.put('b', 'Albert'); multimap.put('b', 'Tom'); multimap.put('d', 'Sam'); multimap.put('d', 'Reo'); multimap.put('g', 'Jack'); multimap.put('g', 'David'); System.out.println('----- Printing Multimap using keySet ----- '); //loop iterate over multimap for (String lastName: multimap.keySet()) { //printing key and values System.out.println(lastName + ': ' + multimap.get(lastName)); } } } </collection></map.entry<k,></k,>
Ieșire:
----- Printing Multimap using keySet ----- a: [Andrew] b: [Albert, Tom] d: [Sam, Reo] g: [Jack, David]
Folosind Biblioteca Guava de la Google
Multihartă interfața este definită în com.google.common.collect pachet al bibliotecii Guava. Implementează multe clase numite după cum urmează:
ArrayListMultimap, ForwardingListMultimap, ForwardingMultimap, ForwardingSetMultimap, ForwardingSortedSetMultimap, HashMultimap, ImmutableListMultimap, ImmutableMultimap, ImmutableSetMultimap, LinkedHashMultimap, LinkedListMultimap, TreeMultimap.
Sintaxă:
panda iterrows
@GwtCompatible public interface Multimap
O colecție care mapează cheile la valori (la fel ca în Hartă), dar fiecare cheie poate fi asociată cu mai multe valori. Putem vizualiza conținutul unei hărți multiple fie ca o hartă de la chei la colecții nevide de valori. De exemplu:
- X → 1, 2
- Y → 3
sau
- X → 1
- X → 2
- Y → 3
Metode de interfață Java Multimap
Metodă | Descriere |
---|---|
asMap() | Returnează o vizualizare a acestei hărți multiple ca o hartă de la fiecare cheie distinctă la colecția nevidă a valorilor asociate acelei chei. |
clar() | Îndepărtează toate perechile cheie-valoare din hartă multiplă, lăsând-o goală. |
containsEntry(cheie obiect, valoare obiect) | Returnează adevărat dacă această hartă multiplă conține cel puțin o pereche cheie-valoare cu cheia și valoarea. |
containsKey(cheie obiect) | Returnează adevărat dacă această hartă multiplă conține cel puțin o pereche cheie-valoare cu cheia. |
containsValue(Valoare obiect) | Returnează adevărat dacă această hartă multiplă conține cel puțin o pereche cheie-valoare cu valoarea. |
intrări() | Returnează o colecție de vizualizare a tuturor perechilor cheie-valoare conținute în această hartă multiplă, ca instanțe Map.Entry. |
este egal(obiect obiect) | Compară obiectul specificat cu această multimap pentru egalitate. |
forEach (acțiune BiConsumer) | Efectuează acțiunea dată pentru toate perechile cheie-valoare conținute în această multimap. |
obține (tasta K) | Returnează o colecție de vizualizare a valorilor asociate cu cheia din această hartă multiplă, dacă există. |
hashCode() | Returnează codul hash pentru această hartă multiplă. |
este gol() | Returnează adevărat dacă această hartă multiplă nu conține perechi cheie-valoare. |
chei() | Returnează o colecție de vizualizări care conține cheia de la fiecare pereche cheie-valoare din această hartă multiplă, fără a restrânge duplicatele. |
keySet() | Returnează o colecție de vizualizare a tuturor cheilor distincte conținute în această hartă multiplă. |
pune (tasta K, valoarea V) | Stochează o pereche cheie-valoare în această hartă multiplă. |
putAll(cheie K, valori iterabile) | Stochează o pereche cheie-valoare în această hartă multiplă pentru fiecare dintre valori, toate folosind aceeași cheie, cheie. |
putAll(Multimap multimap) | Stochează toate perechile cheie-valoare de multimap în această multimap, în ordinea returnată de multimap.entries(). |
eliminați (cheia obiectului, valoarea obiectului) | Îndepărtează o singură pereche cheie-valoare cu cheia și valoarea din această hartă multiplă, dacă aceasta există. |
removeAll (cheie obiect) | Îndepărtează toate valorile asociate cheii. |
replaceValues (cheie K, valori iterabile) | Stochează o colecție de valori cu aceeași cheie, înlocuind orice valori existente pentru acea cheie. |
mărimea() | Returnează numărul de perechi cheie-valoare din această hartă multiplă. |
valori() | Returnează o colecție de vizualizare care conține valoarea din fiecare pereche cheie-valoare conținută în această multimap, fără a restrânge duplicatele (deci values().size() == size()). |