Java ofereix diverses biblioteques de col·leccions integrades útils. Però de vegades necessitem un tipus especial de col·leccions que no estan incorporades a la biblioteca estàndard de Java. Una d'aquesta col·lecció és la Multimapa . En aquesta secció, aprendrem què és el multimapa i com implementar multimapa a Java, i la Interfície multimapa de la biblioteca de Guava.
Multimapa de Java
A Java, Mapa és una estructura de dades que ens permet mapar clau a valor. D'altra banda, multimap és un nou tipus de col·lecció que es troba a la biblioteca Guava que permet el mapeig d'una sola clau a diversos valors (com les relacions un a molts en el SGBD). Però tingueu en compte que JDK no permet el multimapping.
La solució alternativa per implementar multimapa a Java utilitzant la biblioteca Guava de Google i les biblioteques Apache Commons Collections. Tots dos ofereixen una implementació de la interfície Multimap. Pot emmagatzemar més d'un valor en una sola clau. Tant les claus com els valors emmagatzemats a la col·lecció i considerats com a alternativa Mapa
javascript for bucle
Però utilitzar Multimap de la biblioteca Guava de Google no ens és molt útil. En canvi, implementarem la nostra pròpia classe Multimap a Java que també es pot personalitzar en conseqüència. És fàcil escriure una classe Multimap en Java.
El següent programa Java mostra la implementació de la classe Multimap a Java mitjançant Map i la col·lecció.
Implementació Java Multimap
MultimapExample.java
empresa vs empresa
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,>
Sortida:
----- Printing Multimap using keySet ----- a: [Andrew] b: [Albert, Tom] d: [Sam, Reo] g: [Jack, David]
Utilitzant la biblioteca Guava de Google
Multimapa la interfície es defineix a com.google.common.collect paquet de la biblioteca Guava. Implementa moltes classes anomenades de la següent manera:
ArrayListMultimap, ForwardingListMultimap, ForwardingMultimap, ForwardingSetMultimap, ForwardingSortedSetMultimap, HashMultimap, ImmutableListMultimap, ImmutableMultimap, ImmutableSetMultimap, LinkedHashMultimap, LinkedListMultimap, TreeMultimap.
com descarregar vídeo de youtube vlc
Sintaxi:
@GwtCompatible public interface Multimap
Una col·lecció que assigna claus a valors (igual que a Map), però cada clau pot estar associada a diversos valors. Podem visualitzar el contingut d'un multimapa com un mapa des de claus fins a col·leccions de valors no buides. Per exemple:
- X → 1, 2
- I → 3
o
- X → 1
- X → 2
- I → 3
Mètodes d'interfície multimapa de Java
Mètode | Descripció |
---|---|
asMap() | Retorna una vista d'aquest multimapa com un mapa des de cada clau diferent a la col·lecció no buida dels valors associats d'aquesta clau. |
clar () | Elimina tots els parells clau-valor del multimapa i el deixa buit. |
containsEntry (clau de l'objecte, valor de l'objecte) | Retorna true si aquest multimapa conté almenys un parell clau-valor amb la clau i el valor. |
containsKey (clau d'objecte) | Retorna true si aquest multimapa conté almenys un parell clau-valor amb la clau. |
containsValue (Valor de l'objecte) | Retorna true si aquest multimapa conté almenys un parell clau-valor amb el valor. |
entrades () | Retorna una col·lecció de visualitzacions de tots els parells clau-valor continguts en aquest multimapa, com a instàncies de Map.Entry. |
iguals (objecte objecte) | Compara l'objecte especificat amb aquest multimapa per a la igualtat. |
forEach (acció de biconsumidor) | Realitza l'acció donada per a tots els parells clau-valor continguts en aquest multimapa. |
obtenir (clau K) | Retorna una col·lecció de visualització dels valors associats a la clau en aquest multimapa si n'hi ha. |
hashCode() | Retorna el codi hash per a aquest multimapa. |
està buit() | Retorna true si aquest multimapa no conté parells clau-valor. |
claus() | Retorna una col·lecció de visualitzacions que conté la clau de cada parell clau-valor d'aquest multimapa, sense reduir els duplicats. |
keySet() | Retorna una col·lecció de visualitzacions de totes les claus diferents contingudes en aquest multimapa. |
posar (clau K, valor V) | Emmagatzema un parell clau-valor en aquest multimapa. |
putAll (clau K, valors iterables) | Emmagatzema un parell clau-valor en aquest multimapa per a cadascun dels valors, tots utilitzant la mateixa clau, clau. |
putAll(Multimapa multimapa) | Emmagatzema tots els parells clau-valor de multimapa en aquest multimapa, en l'ordre que retorna multimap.entries(). |
eliminar (clau de l'objecte, valor de l'objecte) | Elimina un únic parell clau-valor amb la clau i el valor d'aquest multimapa, si n'hi ha. |
removeAll (clau d'objecte) | Elimina tots els valors associats a la clau. |
replaceValues (clau K, valors iterables) | Emmagatzema una col·lecció de valors amb la mateixa clau, substituint qualsevol valor existent per a aquesta clau. |
mida () | Retorna el nombre de parells clau-valor en aquest multimapa. |
valors () | Retorna una col·lecció de visualitzacions que conté el valor de cada parell clau-valor contingut en aquest multimapa, sense reduir els duplicats (per tant, values().size() == size()). |