Java предоставя различни полезни вградени библиотеки за колекции. Но понякога се нуждаехме от специален тип колекции, които не са вградени в стандартната библиотека на Java. Една от тази колекция е Мултикарта . В този раздел ще научим какво е multimap и как да внедрите мултимап в Java, и на Multimap интерфейс на библиотеката Гуава.
Java Multimap
В Java, Карта е структура от данни, която ни позволява да съпоставим ключ към стойност. От друга страна, multimap е нов тип колекция, открит в библиотеката Guava, който позволява картографирането на единичен ключ към множество стойности (като релации 'един към много' в СУБД). Но имайте предвид, че JDK не позволява мултикартиране.
Алтернативното решение за внедряване на multimap в Java чрез използване на библиотеката Guava на Google и библиотеките на Apache Commons Collections. И двете предоставят имплементация на интерфейса Multimap. Може да съхранява повече от една стойност срещу един ключ. Както ключовете, така и стойностите, съхранявани в колекцията и считани за алтернатива на Карта
латексова матрица
Но използването на Multimap на библиотеката Guava на Google не е много полезно за нас. Вместо това ще внедрим наш собствен клас Multimap в Java, който също може да бъде персонализиран по съответния начин. Лесно е да напишете клас Multimap в Java.
Следващата Java програма изобразява реализацията на класа Multimap в Java с помощта на Map и колекция.
Реализация на Java Multimap
MultimapExample.java
powershell срещу 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,>
Изход:
----- Printing Multimap using keySet ----- a: [Andrew] b: [Albert, Tom] d: [Sam, Reo] g: [Jack, David]
Използване на библиотеката Guava на Google
Мултикарта интерфейсът е дефиниран в com.google.common.collect пакет от библиотеката Guava. Той реализира много класове, наречени както следва:
ArrayListMultimap, ForwardingListMultimap, ForwardingMultimap, ForwardingSetMultimap, ForwardingSortedSetMultimap, HashMultimap, ImmutableListMultimap, ImmutableMultimap, ImmutableSetMultimap, LinkedHashMultimap, LinkedListMultimap, TreeMultimap.
операционна система linux
Синтаксис:
@GwtCompatible public interface Multimap
Колекция, която съпоставя ключове със стойности (същите като в Map), но всеки ключ може да бъде свързан с множество стойности. Можем да визуализираме съдържанието на мултикарта или като карта от ключове към непразни колекции от стойности. Например:
- X → 1, 2
- Y → 3
или
- X → 1
- X → 2
- Y → 3
Методи на Java Multimap Interface
Метод | Описание |
---|---|
asMap() | Той връща изглед на тази мултикарта като карта от всеки различен ключ към непразната колекция от асоциирани стойности на този ключ. |
ясно() | Той премахва всички двойки ключ-стойност от мултикартата, оставяйки я празна. |
съдържаEntry(обектен ключ, стойност на обект) | Връща истина, ако тази множествена карта съдържа поне една двойка ключ-стойност с ключа и стойността. |
съдържа ключ (обектен ключ) | Връща истина, ако тази мултикарта съдържа поне една двойка ключ-стойност с ключа. |
съдържа стойност (стойност на обект) | Връща истина, ако тази множествена карта съдържа поне една двойка ключ-стойност със стойността. |
записи () | Той връща колекция от изгледи на всички двойки ключ-стойност, съдържащи се в тази мултикарта, като екземпляри на Map.Entry. |
е равно (Object obj) | Той сравнява посочения обект с тази мултикарта за равенство. |
forEach(действие BiConsumer) | Той изпълнява даденото действие за всички двойки ключ-стойност, съдържащи се в тази мултикарта. |
вземете (клавиш K) | Той връща колекция от изгледи на стойностите, свързани с ключа в тази мултикарта, ако има такива. |
хеш код() | Той връща хеш кода за тази мултикарта. |
празно е() | Връща истина, ако тази множествена карта не съдържа двойки ключ-стойност. |
ключове() | Той връща колекция от изгледи, съдържаща ключа от всяка двойка ключ-стойност в тази мултикарта, без свиване на дубликати. |
keySet() | Той връща колекция от изгледи на всички отделни ключове, съдържащи се в тази мултикарта. |
постави (клавиш K, V стойност) | Съхранява двойка ключ-стойност в тази мултикарта. |
putAll(ключ K, итерируеми стойности) | Той съхранява двойка ключ-стойност в тази мултикарта за всяка от стойностите, като всички използват един и същ ключ, key. |
putAll(Multimap multimap) | Той съхранява всички двойки ключ-стойност на multimap в това multimap, в реда, върнат от multimap.entries(). |
премахване (ключ на обект, стойност на обект) | Той премахва една единствена двойка ключ-стойност с ключа и стойността от тази мултикарта, ако такава съществува. |
removeAll (обектен ключ) | Той премахва всички стойности, свързани с ключа. |
replaceValues(ключ K, итерируеми стойности) | Той съхранява колекция от стойности със същия ключ, замествайки всички съществуващи стойности за този ключ. |
размер () | Той връща броя на двойките ключ-стойност в тази мултикарта. |
стойности() | Той връща колекция от изгледи, съдържаща стойността от всяка двойка ключ-стойност, съдържаща се в тази мултикарта, без свиване на дубликати (така стойности().size() == size()). |