المجموعة المتعددة، المعروفة أيضًا باسم الكيس (bag)، هي مجموعة تسمح بوجود مثيلات متعددة من العنصر نفسه. على عكس المجموعات، حيث يكون كل عنصر فريدًا، يمكن أن تحتوي المجموعات المتعددة على عناصر مكررة. بينما لا توفر مكتبة Java القياسية تنفيذًا مباشرًا للمجموعة المتعددة، إلا أن هناك عدة طرق يمكن أن تحقق هذه الوظيفة بكفاءة.
جدول المحتويات
- تنفيذ المجموعات المتعددة في Java
- مثال تنفيذ HashMap
- الاستفادة من Multiset في Guava
- اختيار النهج المناسب
تنفيذ المجموعات المتعددة في Java
توجد عدة طرق لإنشاء مجموعة متعددة في Java. يعتمد الخيار الأمثل على احتياجاتك وأولوياتك الخاصة:
- استخدام
HashMap
: هذه طريقة مباشرة. يقومHashMap
بتعيين كل عنصر إلى عدده. إضافة عنصر يزيد من عدده؛ إزالة عنصر يقلل من عدده (مع مراعاة التعامل مع العد صفر بشكل مناسب). - استخدام
TreeMap
: مشابه لـHashMap
، لكنTreeMap
يحافظ على الترتيب المصنف بناءً على الترتيب الطبيعي أوComparator
مخصص. مفيد عندما يكون ترتيب العنصر أمرًا بالغ الأهمية. - استخدام
Multiset
من Guava: توفر مكتبة Guava تنفيذًا قويًا ومحسّنًا لـMultiset
. هذه هي الطريقة المفضلة بشكل عام نظرًا لسهولتها وكفاءتها. - إنشاء فئة مخصصة: في السيناريوهات المعقدة أو المتطلبات الفريدة، توفر الفئة المخصصة أقصى قدر من المرونة ولكنها تتطلب المزيد من جهد التطوير.
مثال تنفيذ HashMap
فيما يلي تنفيذ أساسي للمجموعة المتعددة باستخدام HashMap
:
import java.util.HashMap;
import java.util.Map;
public class MultisetHashMap {
private Map<String, Integer> elements;
public MultisetHashMap() {
elements = new HashMap<>();
}
public void add(String element) {
elements.put(element, elements.getOrDefault(element, 0) + 1);
}
public void remove(String element) {
if (elements.containsKey(element)) {
int count = elements.get(element);
if (count > 1) {
elements.put(element, count - 1);
} else {
elements.remove(element);
}
}
}
public int getCount(String element) {
return elements.getOrDefault(element, 0);
}
public static void main(String[] args) {
MultisetHashMap multiset = new MultisetHashMap();
multiset.add("apple");
multiset.add("banana");
multiset.add("apple");
multiset.add("apple");
System.out.println("عدد التفاحات: " + multiset.getCount("apple")); // الإخراج: 3
multiset.remove("apple");
System.out.println("عدد التفاحات بعد الإزالة: " + multiset.getCount("apple")); // الإخراج: 2
}
}
الاستفادة من Multiset في Guava
يوفر Multiset
من Guava حلاً أنظف وأكثر كفاءة:
import com.google.common.collect.HashMultiset;
import com.google.common.collect.Multiset;
public class MultisetGuava {
public static void main(String[] args) {
Multiset<String> multiset = HashMultiset.create();
multiset.add("apple");
multiset.add("banana");
multiset.add("apple");
multiset.add("apple");
System.out.println("عدد التفاحات: " + multiset.count("apple")); // الإخراج: 3
multiset.remove("apple");
System.out.println("عدد التفاحات بعد الإزالة: " + multiset.count("apple")); // الإخراج: 2
System.out.println("حجم المجموعة المتعددة: " + multiset.size()); //الإخراج: 3
for(String element : multiset){
System.out.println("عنصر: " + element + ", عدد: " + multiset.count(element));
}
}
}
تذكر تضمين تبعية Guava في ملف بناء مشروعك.
اختيار النهج المناسب
بالنسبة لمعظم التطبيقات، يُوصى باستخدام Multiset
من Guava نظرًا لمتانته وكفاءته. يُعد نهج HashMap
مناسبًا للسيناريوهات الأبسط حيث لا تحتاج إلى الميزات الإضافية لـ Guava. لا تكون الفئة المخصصة ضرورية إلا في المواقف المتخصصة للغاية.