Java udostępnia różne przydatne wbudowane biblioteki kolekcji. Czasami jednak potrzebowaliśmy specjalnego typu kolekcji, które nie są wbudowane w standardową bibliotekę Java. Jednym z elementów tej kolekcji jest Multimapa . W tej sekcji dowiemy się, czym jest multimap i jak zaimplementować multimapę w Javie, i Interfejs wielu map biblioteki Guava.
Multimapa Java
na Jawie, Mapa to struktura danych, która pozwala nam mapować klucz na wartość. Z drugiej strony multimap to nowy typ kolekcji znaleziony w bibliotece Guava, który umożliwia mapowanie pojedynczego klucza na wiele wartości (jak relacje jeden do wielu w systemie DBMS). Należy jednak pamiętać, że JDK nie pozwala na multimapowanie.
Alternatywne rozwiązanie do implementacji multimap w Javie przy użyciu biblioteki Google Guava i bibliotek Apache Commons Collections. Obydwa zapewniają implementację interfejsu Multimap. Może przechowywać więcej niż jedną wartość dla jednego klucza. Zarówno klucze, jak i wartości przechowywane w kolekcji i uważane za alternatywę Mapa
oops, koncepcje w Javie
Jednak korzystanie z Multimapy z biblioteki Google Guava nie jest dla nas zbyt pomocne. Zamiast tego zaimplementujemy naszą własną klasę Multimap w Javie, którą można również odpowiednio dostosować. Napisanie klasy Multimap w Javie jest łatwe.
Poniższy program w języku Java przedstawia implementację klasy Multimap w języku Java przy użyciu mapy i kolekcji.
Implementacja wielu map Java
MultimapExample.java
hashset vs hashmap
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,>
Wyjście:
----- Printing Multimap using keySet ----- a: [Andrew] b: [Albert, Tom] d: [Sam, Reo] g: [Jack, David]
Korzystanie z biblioteki Google Guava
Multimapa interfejs jest zdefiniowany w com.google.common.collect pakiet biblioteki Guava. Implementuje wiele klas o następujących nazwach:
ArrayListMultimap, ForwardingListMultimap, ForwardingMultimap, ForwardingSetMultimap, ForwardingSortedSetMultimap, HashMultimap, ImmutableListMultimap, ImmutableMultimap, ImmutableSetMultimap, LinkedHashMultimap, LinkedListMultimap, TreeMultimap.
Składnia:
@GwtCompatible public interface Multimap
Kolekcja, która mapuje klucze na wartości (tak samo jak w Mapie), ale każdy klucz może być powiązany z wieloma wartościami. Możemy wizualizować zawartość multimapy jako mapę od kluczy do niepustych zbiorów wartości. Na przykład:
co jest och
- X → 1, 2
- Y → 3
Lub
- X → 1
- X → 2
- Y → 3
Metody interfejsu wielomapowego Java
metoda | Opis |
---|---|
jakoMapa() | Zwraca widok tej multimapy jako mapę z każdego odrębnego klucza do niepustej kolekcji wartości powiązanych z tym kluczem. |
jasne() | Usuwa wszystkie pary klucz-wartość z multimapy, pozostawiając ją pustą. |
zawieraEntry (klucz obiektu, wartość obiektu) | Zwraca wartość true, jeśli ta multimapa zawiera co najmniej jedną parę klucz-wartość z kluczem i wartością. |
zawieraKey (klucz obiektu) | Zwraca wartość true, jeśli ta multimapa zawiera co najmniej jedną parę klucz-wartość z kluczem. |
zawieraWartość (wartość obiektu) | Zwraca wartość true, jeśli ta multimapa zawiera co najmniej jedną parę klucz-wartość z wartością. |
wpisy() | Zwraca kolekcję widoków wszystkich par klucz-wartość zawartych w tej multimapie jako instancje Map.Entry. |
równa się (obiekt obiektu) | Porównuje określony obiekt z tą multimapą pod kątem równości. |
forEach (akcja BiConsumer) | Wykonuje daną akcję dla wszystkich par klucz-wartość zawartych w tej multimapie. |
pobierz (klawisz K) | Zwraca kolekcję widoków wartości skojarzonych z kluczem w tej multimapie, jeśli taka istnieje. |
hashCode() | Zwraca kod skrótu dla tej multimapy. |
jest pusty() | Zwraca wartość true, jeśli ta multimapa nie zawiera par klucz-wartość. |
Klucze() | Zwraca kolekcję widoków zawierającą klucz z każdej pary klucz-wartość w tej multimapie, bez zwijania duplikatów. |
zestaw kluczy() | Zwraca kolekcję widoków wszystkich odrębnych kluczy zawartych w tej multimapie. |
put (klawisz K, wartość V) | Przechowuje parę klucz-wartość w tej multimapie. |
putAll (klawisz K, wartości iterowalne) | Przechowuje parę klucz-wartość w tej multimapie dla każdej wartości, wszystkie przy użyciu tego samego klucza, klucza. |
putAll (wielomapowa mapa) | Przechowuje wszystkie pary klucz-wartość multimapy w tej multimapie, w kolejności zwracanej przez multimap.entries(). |
usuń (klucz obiektu, wartość obiektu) | Usuwa pojedynczą parę klucz-wartość z kluczem i wartością z tej multimapy, jeśli taka istnieje. |
usuń wszystko (klucz obiektu) | Usuwa wszystkie wartości powiązane z kluczem. |
zamieńWartości (klawisz K, wartości iterowalne) | Przechowuje zbiór wartości z tym samym kluczem, zastępując wszelkie istniejące wartości dla tego klucza. |
rozmiar() | Zwraca liczbę par klucz-wartość w tej multimapie. |
wartości() | Zwraca kolekcję widoków zawierającą wartości z każdej pary klucz-wartość zawartej w tej multimapie, bez zwijania duplikatów (więc wartości().size() == size()). |