Java nodrošina dažādas noderīgas iebūvētas kolekcijas bibliotēkas. Bet dažreiz mums bija vajadzīgas īpaša veida kolekcijas, kas nav iebūvētas Java standarta bibliotēkā. Viena no šīs kolekcijas ir Multikarte . Šajā sadaļā mēs uzzināsim, kas ir multimap un kā ieviest multikarti Java, un Multimap interfeiss no Guavas bibliotēkas.
Java multikarte
Java valodā, Karte ir datu struktūra, kas ļauj kartēt atslēgu uz vērtību. No otras puses, multikarte ir jauns kolekcijas veids, kas atrodams Guavas bibliotēkā, kas ļauj kartēt vienu atslēgu ar vairākām vērtībām (piemēram, relācijas viens pret daudziem DBVS). Taču ņemiet vērā, ka JDK neatļauj vairākkartēšanu.
Alternatīvs risinājums multikartes ieviešanai Java, izmantojot Google Guava bibliotēku un Apache Commons Collections bibliotēkas. Abi nodrošina Multimap interfeisa ieviešanu. Tas var saglabāt vairāk nekā vienu vērtību pret vienu atslēgu. Gan atslēgas, gan vērtības, kas glabājas kolekcijā un tiek uzskatītas par alternatīvu Karte
java kamēr nosacījums
Taču Google Guavas bibliotēkas Multimap izmantošana mums nav īpaši noderīga. Tā vietā mēs Java ieviesīsim paši savu Multimap klasi, kuru var arī attiecīgi pielāgot. Java ir viegli uzrakstīt Multimap klasi.
Šī Java programma attēlo Multimap klases ieviešanu Java, izmantojot karti un kolekciju.
Java Multimap ieviešana
MultimapExample.java
masīvs Java valodā
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,>
Izvade:
----- Printing Multimap using keySet ----- a: [Andrew] b: [Albert, Tom] d: [Sam, Reo] g: [Jack, David]
Izmantojot Google Gvajaves bibliotēku
Multikarte interfeiss ir definēts com.google.common.collect Guavas bibliotēkas pakete. Tas ievieš daudzas klases, kas nosauktas šādi:
ArrayListMultimap, ForwardingListMultimap, ForwardingMultimap, ForwardingSetMultimap, ForwardingSortedSetMultimap, HashMultimap, ImmutableListMultimap, ImmutableMultimap, ImmutableSetMultimap, LinkedHashMultimap, TreisteMultimap, TreisteMultimap.
Sintakse:
kā es varu jaunināt java
@GwtCompatible public interface Multimap
Kolekcija, kas kartē atslēgas ar vērtībām (tā pati kā kartē), taču katra atslēga var būt saistīta ar vairākām vērtībām. Mēs varam vizualizēt multikartes saturu vai nu kā karti no taustiņiem līdz tukšām vērtību kolekcijām. Piemēram:
- X → 1, 2
- Y → 3
vai
- X → 1
- X → 2
- Y → 3
Java Multimap interfeisa metodes
Metode | Apraksts |
---|---|
asMap() | Tas atgriež šīs multikartes skatu kā karti no katras atšķirīgās atslēgas ar šo atslēgu saistīto vērtību tukšajā kolekcijā. |
skaidrs () | Tas noņem visus atslēgu un vērtību pārus no multikartes, atstājot to tukšu. |
saturEntry (objekta atslēga, objekta vērtība) | Tas atgriež patieso vērtību, ja šajā vairākkartē ir vismaz viens atslēgas vērtību pāris ar atslēgu un vērtību. |
includeKey (objekta atslēga) | Tas atgriež patieso vērtību, ja šajā vairākkartē ir vismaz viens atslēgas vērtību pāris ar atslēgu. |
saturVērtība (objekta vērtība) | Tas atgriež vērtību True, ja šajā vairākkartē ir vismaz viens atslēgas vērtību pāris ar vērtību. |
ieraksti () | Tas atgriež visu šajā multikartē ietverto atslēgu un vērtību pāru skatu kolekciju kā Map.Entry gadījumus. |
vienāds (Objekts objekts) | Tas salīdzina norādīto objektu ar šo multikarti vienlīdzības labad. |
forEach (divu patērētāju darbība) | Tas veic doto darbību visiem atslēgu-vērtību pāriem, kas ietverti šajā multikartē. |
saņemt (taustiņš K) | Tas atgriež skatu kolekciju ar vērtībām, kas saistītas ar atslēgu šajā daudzkartē, ja tāda ir. |
hashCode() | Tas atgriež šīs multikartes jaucējkodu. |
ir tukšs() | Tas atgriež patieso vērtību, ja šajā vairākkartē nav atslēgu un vērtību pāru. |
atslēgas () | Tas atgriež skatu kolekciju, kurā ir atslēga no katra atslēgas vērtību pāra šajā daudzkartē, nesakļaujot dublikātus. |
keySet() | Tas atgriež skatu kolekciju ar visām atšķirīgām atslēgām, kas ietvertas šajā multikartē. |
likt (taustiņš K, V vērtība) | Saglabā atslēgas vērtību pāri šajā daudzkartē. |
putAll (atslēga K, atkārtojamas vērtības) | Tas saglabā atslēgas-vērtības pāri šajā daudzkartē katrai vērtībai, izmantojot vienu un to pašu atslēgu, atslēgu. |
ievietot visu (vairāku karšu multikarte) | Tas saglabā visus multikartes atslēgu-vērtību pārus šajā multikartē tādā secībā, kādu atgriež multimap.entries(). |
noņemt (objekta atslēga, objekta vērtība) | Tas noņem vienu atslēgas vērtību pāri ar atslēgu un vērtību no šīs multikartes, ja tāda pastāv. |
noņemt visu (objekta atslēga) | Tas noņem visas ar atslēgu saistītās vērtības. |
aizstājvērtības (atslēga K, atkārtojamas vērtības) | Tas saglabā vērtību kolekciju ar to pašu atslēgu, aizstājot visas esošās šīs atslēgas vērtības. |
Izmērs() | Tas atgriež atslēgu un vērtību pāru skaitu šajā daudzkartē. |
vērtības () | Tas atgriež skatu kolekciju, kurā ir vērtība no katra šajā multikartē ietvertā atslēgu-vērtību pāra, nesalaužot dublikātus (tātad vērtības().size() == size()). |