Java nudi razne korisne ugrađene biblioteke zbirki. Ali ponekad smo zahtijevali posebne vrste kolekcija koje nisu ugrađene u Javinu standardnu biblioteku. Jedna od ove zbirke je Multimap . U ovom odjeljku naučit ćemo što je multimap i kako implementirati multimap u Javi, i Multimap sučelje knjižnice Guava.
Java Multimap
U Javi, Karta je struktura podataka koja nam omogućuje mapiranje ključa u vrijednost. S druge strane, multimap je nova vrsta zbirke koja se nalazi u biblioteci Guava koja omogućuje mapiranje jednog ključa u više vrijednosti (poput odnosa jedan prema više u DBMS-u). Ali imajte na umu da JDK ne dopušta multimapiranje.
Alternativno rješenje za implementaciju multimapa u Javi korištenjem Googleove biblioteke Guava i biblioteka Apache Commons Collections. Oba pružaju implementaciju Multimap sučelja. Može pohraniti više od jedne vrijednosti prema jednom ključu. I ključevi i vrijednosti pohranjeni u zbirci i razmatrani kao alternativa Karta
java kako nadjačati
No korištenje Multimapa Googleove Guava knjižnice nije nam od velike pomoći. Umjesto toga, implementirat ćemo vlastitu klasu Multimap u Javi koja se također može prilagoditi u skladu s tim. Lako je napisati Multimap klasu u Javi.
Sljedeći Java program opisuje implementaciju klase Multimap u Javi koristeći Map i kolekciju.
Java Multimap Implementacija
MultimapExample.java
očisti predmemoriju npm
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,>
Izlaz:
----- Printing Multimap using keySet ----- a: [Andrew] b: [Albert, Tom] d: [Sam, Reo] g: [Jack, David]
Korištenje Googleove knjižnice Guava
Multimap sučelje je definirano u com.google.common.collect paket knjižnice Guava. Implementira mnoge klase nazvane na sljedeći način:
ArrayListMultimap, ForwardingListMultimap, ForwardingMultimap, ForwardingSetMultimap, ForwardingSortedSetMultimap, HashMultimap, ImmutableListMultimap, ImmutableMultimap, ImmutableSetMultimap, LinkedHashMultimap, LinkedListMultimap, TreeMultimap.
Sintaksa:
@GwtCompatible public interface Multimap
Zbirka koja preslikava ključeve u vrijednosti (isto kao u mapi), ali svaki ključ može biti povezan s više vrijednosti. Možemo vizualizirati sadržaj multimapa ili kao mapu od ključeva do nepraznih kolekcija vrijednosti. Na primjer:
- X → 1, 2
- Y → 3
ili
algoritam brzog sortiranja
- X → 1
- X → 2
- Y → 3
Metode Java Multimap sučelja
metoda | Opis |
---|---|
asMap() | Vraća pogled na ovu višestruku mapu kao mapu sa svakog zasebnog ključa na nepraznu kolekciju pridruženih vrijednosti tog ključa. |
čisto() | Uklanja sve parove ključ-vrijednost iz multimape, ostavljajući je praznom. |
containsEntry(ključ objekta, vrijednost objekta) | Vraća true ako ova multimapa sadrži barem jedan par ključ-vrijednost s ključem i vrijednošću. |
sadrži ključ (ključ objekta) | Vraća true ako ova multimapa sadrži barem jedan par ključ-vrijednost s ključem. |
sadržiVrijednost(vrijednost objekta) | Vraća true ako ova multimapa sadrži barem jedan par ključ-vrijednost s vrijednošću. |
unosi() | Vraća zbirku prikaza svih parova ključ-vrijednost sadržanih u ovoj multimapi, kao instance Map.Entry. |
jednako (Object obj) | Uspoređuje navedeni objekt s ovom multimapom radi jednakosti. |
forEach(radnja BiConsumer) | Izvodi zadanu radnju za sve parove ključ-vrijednost sadržane u ovoj multimapi. |
dobiti (tipka K) | Vraća zbirku prikaza vrijednosti povezanih s ključem u ovoj multimapi ako postoji. |
hashCode() | Vraća hash kod za ovu multimapu. |
prazno je() | Vraća true ako ova multimapa ne sadrži parove ključ-vrijednost. |
ključevi () | Vraća zbirku pogleda koja sadrži ključ iz svakog para ključ-vrijednost u ovoj multimapi, bez sažimanja duplikata. |
KeySet() | Vraća zbirku prikaza svih različitih ključeva sadržanih u ovoj multimapi. |
staviti (K ključ, V vrijednost) | Pohranjuje par ključ-vrijednost u ovoj multimapi. |
putAll(ključ K, vrijednosti koje se mogu ponavljati) | Pohranjuje par ključ-vrijednost u ovoj multimapi za svaku od vrijednosti, sve koristeći isti ključ, ključ. |
putAll(Multimap multimap) | Pohranjuje sve parove ključ-vrijednost multimapa u ovom multimapu, redoslijedom koji vraća multimap.entries(). |
ukloniti (ključ objekta, vrijednost objekta) | Uklanja jedan par ključ-vrijednost s ključem i vrijednošću iz ove multimape, ako takva postoji. |
removeAll(ključ objekta) | Uklanja sve vrijednosti povezane s ključem. |
replaceValues(ključ K, vrijednosti koje se mogu ponavljati) | Pohranjuje kolekciju vrijednosti s istim ključem, zamjenjujući sve postojeće vrijednosti za taj ključ. |
veličina() | Vraća broj parova ključ-vrijednost u ovoj multimapi. |
vrijednosti() | Vraća zbirku prikaza koja sadrži vrijednost iz svakog para ključ-vrijednost sadržanog u ovoj multimapi, bez sažimanja duplikata (dakle, values().size() == size()). |