Java מספקת ספריות אוסף מובנות שונות. אבל לפעמים דרשנו סוג מיוחד של אוספים שאינם מובנים בספרייה הסטנדרטית של Java. אחד מהאוסף הזה הוא מפה מרובת . בסעיף זה, נלמד מה זה multimap ו כיצד ליישם ריבוי מפות ב-Java, וה ממשק ריבוי מפות של ספריית גויאבה.
Java Multimap
ב-Java, מַפָּה הוא מבנה נתונים המאפשר לנו למפות מפתח לערך. מצד שני, multimap הוא סוג אוסף חדש שנמצא בספריית Guava המאפשר מיפוי של מפתח בודד למספר ערכים (כמו קשרים של אחד לרבים ב-DBMS). אבל שימו לב ש-JDK אינו מאפשר ריבוי מיפוי.
הפתרון האלטרנטיבי ליישום ריבוי מפות ב-Java על ידי שימוש בספריית Guava של גוגל ובספריות Apache Commons Collections. שניהם מספקים יישום של ממשק Multimap. זה יכול לאחסן יותר מערך אחד מול מפתח בודד. הן המפתחות והן הערכים המאוחסנים באוסף ונחשבים כחלופה ל מַפָּה
דוגמאות לקוד c#
אבל השימוש ב-Multimap של ספריית הגויאבה של גוגל לא מועיל לנו במיוחד. במקום זאת, ניישם מחלקת Multimap משלנו ב-Java שניתן גם להתאים אישית בהתאם. קל לכתוב מחלקה מולטימפה ב-Java.
תוכנית Java הבאה מתארת את היישום של מחלקת Multimap ב-Java באמצעות Map and collection.
יישום Java Multimap
MultimapExample.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,>
תְפוּקָה:
----- Printing Multimap using keySet ----- a: [Andrew] b: [Albert, Tom] d: [Sam, Reo] g: [Jack, David]
שימוש בספריית הגויאבה של גוגל
מפה מרובת ממשק מוגדר ב com.google.common.collect חבילה של ספריית גויאבה. הוא מיישם מחלקות רבות בשם הבא:
ArrayListMultimap, ForwardingListMultimap, ForwardingMultimap, ForwardingSetMultimap, ForwardingSortedSetMultimap, HashMultimap, ImmutableListMultimap, ImmutableMultimap, ImmutableSetMultimap, LinkedHashMultimap, LinkedHashMultimap, LinkedMultimapL.
תחביר:
@GwtCompatible public interface Multimap
אוסף הממפה מפתחות לערכים (זהה כמו במפה) אך כל מפתח עשוי להיות משויך למספר ערכים. אנו יכולים לדמיין את התוכן של מפה מרובת או כמפה ממפתחות ועד לאוספי ערכים לא ריקים. לדוגמה:
מחרוזת jsonobject
- X → 1, 2
- Y → 3
אוֹ
- X → 1
- X → 2
- Y → 3
שיטות ממשק רב מפות של Java
שיטה | תיאור |
---|---|
asMap() | הוא מחזיר תצוגה של מפה מרובה זו כמפה מכל מפתח נפרד לאוסף הלא ריק של הערכים המשויכים למפתח זה. |
ברור() | זה מסיר את כל צמדי המפתח-ערך מהמפה, ומשאיר אותה ריקה. |
containsEntry(מפתח אובייקט, ערך אובייקט) | היא מחזירה true אם מרובת המפה הזו מכילה לפחות זוג מפתח-ערך אחד עם המפתח והערך. |
containsKey(מפתח אובייקט) | היא מחזירה true אם המולטימפה הזו מכילה לפחות זוג מפתח-ערך אחד עם המפתח. |
containsValue(ערך אובייקט) | זה מחזיר כראוי אם מרובה מפה זו מכילה לפחות זוג מפתח-ערך אחד עם הערך. |
ערכים() | הוא מחזיר אוסף תצוגה של כל צמדי המפתח-ערך הכלולים ב-multimap זה, כמופעי Map.Entry. |
שווה (Object obj) | הוא משווה את האובייקט שצוין עם מפה מרובה זו לצורך שוויון. |
forEach (פעולה BiConsumer) | היא מבצעת את הפעולה הנתונה עבור כל צמדי המפתח-ערך הכלולים במפה מרובה זו. |
קבל (מפתח K) | הוא מחזיר אוסף תצוגות של הערכים המשויכים למפתח ב-multimap זה אם בכלל. |
hashCode() | הוא מחזיר את קוד ה-hash עבור מפה מרובה זו. |
זה ריק() | היא מחזירה true אם המפות המרובות האלה לא מכילות צמדי מפתח-ערך. |
keys() | היא מחזירה אוסף תצוגות המכיל את המפתח מכל זוג מפתח-ערך ב-multimap זה, מבלי לכווץ כפילויות. |
סט מפתחות() | היא מחזירה אוסף תצוגה של כל המפתחות הנבדלים הכלולים ב-multimap זה. |
put (מפתח K, ערך V) | מאחסן זוג מפתח-ערך במפה מרובה זו. |
putAll(K key, Iterable values) | היא מאחסנת זוג מפתח-ערך ב-multimap זה עבור כל אחד מהערכים, כולם באמצעות אותו מפתח, מפתח. |
putAll(Multimap Multimap) | הוא מאחסן את כל זוגות המפתח-ערך של מפות מרובות במפה זו, בסדר המוחזר על ידי multimap.entries(). |
הסר (מפתח אובייקט, ערך אובייקט) | זה מסיר זוג מפתח-ערך יחיד עם המפתח והערך מרב מפה זו, אם קיים כזה. |
removeAll(מפתח אובייקט) | זה מסיר את כל הערכים המשויכים למפתח. |
replaceValues(מפתח K, ערכים ניתנים להחזרה) | הוא מאחסן אוסף של ערכים עם אותו מפתח, ומחליף את כל הערכים הקיימים עבור אותו מפתח. |
גודל() | הוא מחזיר את מספר צמדי המפתח-ערך במפה מרובה זו. |
ערכים() | הוא מחזיר אוסף תצוגות המכיל את הערך מכל זוג מפתח-ערך הכלול במולטי-מפה זו, מבלי לכווץ כפילויות (לכן values().size() == size()). |