„Java“ teikia įvairias naudingas integruotas kolekcijų bibliotekas. Tačiau kartais mums reikėjo specialių kolekcijų, kurios nėra integruotos į standartinę Java biblioteką. Viena iš šios kolekcijos yra Multimap . Šiame skyriuje sužinosime, kas yra multimap ir kaip įdiegti multimap programoje „Java“, ir Multimap sąsaja Gvajavos bibliotekos.
Java Multimap
Java, Žemėlapis yra duomenų struktūra, leidžianti susieti raktą su verte. Kita vertus, „multimap“ yra naujas rinkinio tipas, rastas „Guava“ bibliotekoje, leidžiantis susieti vieną raktą su keliomis reikšmėmis (pvz., DBVS ryšius „vienas su daugeliu“). Tačiau atminkite, kad JDK neleidžia kelių žemėlapių sudarymo.
Alternatyvus sprendimas įdiegti daugialypį vaizdą Java naudojant Google Guava biblioteką ir Apache Commons Collections bibliotekas. Abu pateikia Multimap sąsajos įgyvendinimą. Jis gali saugoti daugiau nei vieną reikšmę viename rakte. Tiek raktai, tiek vertybės, saugomos kolekcijoje ir laikomos alternatyva Žemėlapis
1 milijonas kiek 0
Tačiau „Google“ gvajavos bibliotekos Multimap naudojimas mums nėra labai naudingas. Vietoj to mes įdiegsime savo „Java“ multimap klasę, kurią taip pat galima atitinkamai pritaikyti. „Java“ lengva parašyti Multimap klasę.
Šioje Java programoje vaizduojamas Multimap klasės įdiegimas Java naudojant žemėlapį ir rinkinį.
Java Multimap įgyvendinimas
MultimapExample.java
eilutę palyginkite java
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,>
Išvestis:
----- Printing Multimap using keySet ----- a: [Andrew] b: [Albert, Tom] d: [Sam, Reo] g: [Jack, David]
Naudojant „Google“ gvajavos biblioteką
Multimap sąsaja yra apibrėžta com.google.common.collect Gvajavos bibliotekos paketas. Jis įgyvendina daugybę klasių, pavadintų taip:
ArrayListMultimap, ForwardingListMultimap, ForwardingMultimap, ForwardingSetMultimap, ForwardingSortedSetMultimap, HashMultimap, ImmutableListMultimap, ImmutableMultimap, ImmutableSetMultimap, LinkedHashMultimap, TreistMultimap, TreistMultimap.
java eilutės formatas ilgas
Sintaksė:
@GwtCompatible public interface Multimap
Kolekcija, kuri susieja raktus su reikšmėmis (taip pat kaip ir Žemėlapyje), tačiau kiekvienas raktas gali būti susietas su keliomis reikšmėmis. Daugialypės schemos turinį galime įsivaizduoti kaip žemėlapį nuo raktų iki tuščių verčių rinkinių. Pavyzdžiui:
- X → 1, 2
- Y → 3
arba
- X → 1
- X → 2
- Y → 3
Java Multimap sąsajos metodai
Metodas | apibūdinimas |
---|---|
asMap () | Jis grąžina šios daugialypės schemos vaizdą kaip žemėlapį iš kiekvieno atskiro rakto į netuščią su tuo raktu susijusių reikšmių rinkinį. |
aišku () | Jis pašalina visas raktų ir reikšmių poras iš daugialypės schemos, palikdamas ją tuščią. |
yra įrašas (objekto raktas, objekto reikšmė) | Grąžinama tiesa, jei šioje daugialypėje schemoje yra bent viena rakto-reikšmių pora su raktu ir reikšme. |
includeKey (objekto raktas) | Grąžinama tiesa, jei šioje daugialypės terpės schemoje yra bent viena rakto-reikšmių pora su raktu. |
includeValue (objekto vertė) | Grąžinama tiesa, jei šioje daugialypės terpės schemoje yra bent viena rakto-reikšmių pora su šia verte. |
įrašai () | Jis pateikia visų raktų ir reikšmių porų, esančių šiame daugialypėje schemoje, rodinį kaip Map.Entry egzempliorius. |
lygus (objekto objektas) | Jis lygina nurodytą objektą su šiuo daugialypiu žemėlapiu, kad būtų lygybė. |
už kiekvieną (dviejų vartotojų veiksmas) | Jis atlieka nurodytą veiksmą visoms rakto-reikšmių poroms, esančioms šiame daugialypėje schemoje. |
gauti (K klavišas) | Jis grąžina reikšmių, susietų su raktu šiame daugialypės schemoje, rodinį, jei toks yra. |
maišos kodas () | Jis grąžina maišos kodą šiam daugialypiam žemėlapiui. |
Yra tuščias() | Grąžinama tiesa, jei šioje daugialypėje schemoje nėra raktų ir reikšmių porų. |
raktai() | Jis grąžina rodinių rinkinį, kuriame yra raktas iš kiekvienos raktų ir reikšmių poros šioje daugialypės terpės schemoje, nesutraukiant dublikatų. |
keySet() | Jis grąžina visų skirtingų raktų, esančių šiame daugialypėje schemoje, rodinį. |
įdėti (K klavišas, V reikšmė) | Išsaugo rakto-reikšmių porą šiame daugialypėje schemoje. |
putAll (K raktas, kartojamos reikšmės) | Šioje daugialypėje schemoje ji saugo rakto ir reikšmių porą kiekvienai vertei, naudojant tą patį raktą, raktą. |
įdėti viską (daugialapių žemėlapių) | Jame saugomos visos daugialypės terpės raktų ir reikšmių poros, tokia tvarka, kokia pateikiama multimap.entries(). |
pašalinti (objekto raktas, objekto vertė) | Tai pašalina vieną rakto ir vertės porą su raktu ir verte iš šios daugialypės schemos, jei tokia yra. |
pašalinti viską (objekto raktas) | Tai pašalina visas su raktu susijusias reikšmes. |
pakeisti vertės (K raktas, kartojamos reikšmės) | Jis saugo reikšmių rinkinį su tuo pačiu raktu, pakeičiant visas esamas to rakto reikšmes. |
dydis () | Jis grąžina raktų ir reikšmių porų skaičių šiame daugialypėje schemoje. |
reikšmės () | Jis grąžina rodinių rinkinį, kuriame yra kiekvienos šiame daugialypės schemoje esančios raktų ir reikšmių poros vertės, nesutraukiant dublikatų (taigi reikšmės().size() == dydis()). |