توفر Java العديد من مكتبات المجموعات المضمنة المفيدة. لكن في بعض الأحيان نطلب نوعًا خاصًا من المجموعات غير المضمنة في مكتبة Java القياسية. واحدة من هذه المجموعة هي خريطة متعددة . في هذا القسم، سوف نتعلم ما هو multimap و كيفية تنفيذ multimap في جافا و ال واجهة الخرائط المتعددة من مكتبة الجوافة.
جافا المتعددة الخرائط
في جافا، خريطة هي بنية بيانات تسمح لنا بتعيين المفتاح للقيمة. من ناحية أخرى، multimap هو نوع مجموعة جديد موجود في مكتبة Guava والذي يسمح بتعيين مفتاح واحد لقيم متعددة (مثل علاقات رأس برأس في نظام إدارة قواعد البيانات). لكن لاحظ أن JDK لا يسمح بتعدد الخرائط.
الحل البديل لتنفيذ الخرائط المتعددة في Java باستخدام مكتبة Google Guava ومكتبات Apache Commons Collections. يوفر كلاهما تطبيقًا لواجهة Multimap. يمكنه تخزين أكثر من قيمة مقابل مفتاح واحد. كل من المفاتيح والقيم المخزنة في المجموعة وتعتبر بديلاً لها خريطة
مولد أرقام عشوائية في ج
لكن استخدام Multimap لمكتبة Guava من Google لا يفيدنا كثيرًا. بدلاً من ذلك، سنقوم بتنفيذ فئة Multimap الخاصة بنا في Java والتي يمكن أيضًا تخصيصها وفقًا لذلك. من السهل كتابة فئة Multimap في Java.
يصور برنامج Java التالي تنفيذ فئة Multimap في 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، LinkedListMultimap، TreeMultimap.
بناء الجملة:
@GwtCompatible public interface Multimap
مجموعة تقوم بتعيين المفاتيح للقيم (كما هو الحال في الخريطة) ولكن قد يرتبط كل مفتاح بقيم متعددة. يمكننا تصور محتويات الخريطة المتعددة إما كخريطة من المفاتيح إلى مجموعات القيم غير الفارغة. على سبيل المثال:
- × → 1، 2
- ص → 3
أو
العاب imessage للاندرويد
- × → 1
- × → 2
- ص → 3
طرق واجهة جافا المتعددة الخرائط
طريقة | وصف |
---|---|
asMap() | تقوم بإرجاع عرض لهذه الخريطة المتعددة كخريطة من كل مفتاح مميز إلى المجموعة غير الفارغة من القيم المرتبطة بهذا المفتاح. |
واضح() | فهو يزيل جميع أزواج القيمة الرئيسية من الخريطة المتعددة، ويتركها فارغة. |
يحتوي على إدخال (مفتاح الكائن، قيمة الكائن) | يتم إرجاعه صحيحًا إذا كانت هذه الخريطة المتعددة تحتوي على زوج واحد من القيمة الرئيسية على الأقل مع المفتاح والقيمة. |
يحتوي على مفتاح (مفتاح الكائن) | يتم إرجاعه صحيحًا إذا كانت هذه الخريطة المتعددة تحتوي على زوج واحد على الأقل من قيمة المفتاح مع المفتاح. |
يحتوي على قيمة (قيمة الكائن) | يتم إرجاعه صحيحًا إذا كانت هذه الخريطة المتعددة تحتوي على زوج واحد من القيمة الرئيسية على الأقل مع القيمة. |
الإدخالات () | تقوم بإرجاع مجموعة عرض لجميع أزواج القيمة الرئيسية الموجودة في هذه الخريطة المتعددة، كمثيلات Map.Entry. |
يساوي (كائن كائن) | يقوم بمقارنة الكائن المحدد بهذه الخريطة المتعددة من أجل المساواة. |
forEach (إجراء BiConsumer) | يقوم بتنفيذ الإجراء المحدد لجميع أزواج القيمة الرئيسية الموجودة في هذه الخريطة المتعددة. |
الحصول على (مفتاح K) | تقوم بإرجاع مجموعة عرض للقيم المرتبطة بالمفتاح في هذه الخريطة المتعددة إن وجدت. |
رمز التجزئة () | تقوم بإرجاع رمز التجزئة لهذه الخريطة المتعددة. |
فارغ() | يتم إرجاعه صحيحًا إذا كانت هذه الخريطة المتعددة لا تحتوي على أزواج قيمة المفتاح. |
مفاتيح () | تقوم بإرجاع مجموعة عرض تحتوي على المفتاح من كل زوج من قيمة المفتاح في هذه الخريطة المتعددة، دون طي التكرارات. |
مجموعة المفاتيح () | تقوم بإرجاع مجموعة عرض لجميع المفاتيح المميزة الموجودة في هذه الخريطة المتعددة. |
وضع (مفتاح K، قيمة V) | يخزن زوجًا من القيمة الرئيسية في هذه الخريطة المتعددة. |
putAll(مفتاح K، القيم القابلة للتكرار) | يقوم بتخزين زوج المفتاح والقيمة في هذه الخريطة المتعددة لكل قيمة، وكلها باستخدام نفس المفتاح، المفتاح. |
putAll (الخريطة المتعددة) | يقوم بتخزين جميع أزواج القيمة الرئيسية للخرائط المتعددة في هذه الخريطة المتعددة، بالترتيب الذي يتم إرجاعه بواسطة multimap.entries(). |
إزالة (مفتاح الكائن، قيمة الكائن) | يقوم بإزالة زوج واحد من قيمة المفتاح مع المفتاح والقيمة من هذه الخريطة المتعددة، إذا كانت موجودة. |
إزالة الكل (مفتاح الكائن) | يقوم بإزالة جميع القيم المرتبطة بالمفتاح. |
استبدال القيم (مفتاح K، القيم القابلة للتكرار) | يقوم بتخزين مجموعة من القيم بنفس المفتاح، واستبدال أي قيم موجودة لذلك المفتاح. |
مقاس() | تقوم بإرجاع عدد أزواج القيمة الرئيسية في هذه الخريطة المتعددة. |
قيم() | تقوم بإرجاع مجموعة عرض تحتوي على القيمة من كل زوج من المفاتيح والقيمة الموجودة في هذه الخريطة المتعددة، دون طي التكرارات (لذا فإن value().size() == size()). |