Java Class الذي ينفذ الخريطة ويحافظ على ترتيب الإدراج؟
-
22-08-2019 - |
سؤال
أنا أبحث عن فصل دراسي في جافا يحتوي على ارتباط بقيمة المفتاح، ولكن بدون استخدام التجزئة.إليك ما أفعله حاليًا:
- أضف القيم إلى أ
Hashtable
. - احصل على مكرر لـ
Hashtable.entrySet()
. - التكرار من خلال جميع القيم و:
- احصل على
Map.Entry
للمكرر. - إنشاء كائن من النوع
Module
(فئة مخصصة) بناءً على القيمة. - أضف الفصل إلى JPanel.
- احصل على
- إظهار اللوحة.
تكمن المشكلة في ذلك في أنني لا أتحكم في الترتيب الذي يمكنني من خلاله استعادة القيم، لذلك لا يمكنني عرض القيم بترتيب معين (بدون ترميز الترتيب بشكل ثابت).
سأستخدم ArrayList
أو Vector
لهذا، ولكن لاحقًا في الكود أحتاج إلى الحصول على ملف Module
كائن لمفتاح معين، وهو ما لا أستطيع فعله باستخدام ArrayList
أو Vector
.
هل يعرف أي شخص فئة Java مجانية/مفتوحة المصدر يمكنها القيام بذلك، أو طريقة للحصول على القيم من ملف Hashtable
بناء على متى تم إضافتها؟
شكرًا!
المحلول
أقترح أ LinkedHashMap
أو أ TreeMap
.أ LinkedHashMap
يحتفظ بالمفاتيح بالترتيب الذي تم إدخالها به، بينما أ TreeMap
يتم الاحتفاظ بالفرز عبر أ Comparator
أو الطبيعي Comparable
ترتيب العناصر.
نظرًا لأنه ليس من الضروري الحفاظ على العناصر مرتبة، LinkedHashMap
يجب أن يكون أسرع في معظم الحالات؛ TreeMap
لديه O(log n)
الأداء ل containsKey
, get
, put
, ، و remove
, ، وفقًا لـ Javadocs، بينما LinkedHashMap
يكون O(1)
لكل.
إذا كانت واجهة برمجة التطبيقات الخاصة بك تتوقع فقط ترتيب فرز يمكن التنبؤ به، بدلاً من ترتيب فرز محدد، ففكر في استخدام الواجهات التي تنفذها هاتان الفئتان، NavigableMap
أو SortedMap
.سيسمح لك هذا بعدم تسريب تطبيقات محددة إلى واجهة برمجة التطبيقات (API) الخاصة بك والتبديل إلى أي من تلك الفئات المحددة أو إلى تطبيق مختلف تمامًا حسب الرغبة بعد ذلك.
نصائح أخرى
سيُرجع LinkedHashMap العناصر بالترتيب الذي تم إدراجها به في الخريطة عند التكرار على keySet() أوentrySet() أوvalues() للخريطة.
Map<String, String> map = new LinkedHashMap<String, String>();
map.put("id", "1");
map.put("name", "rohan");
map.put("age", "26");
for (Map.Entry<String, String> entry : map.entrySet()) {
System.out.println(entry.getKey() + " = " + entry.getValue());
}
سيؤدي هذا إلى طباعة العناصر بالترتيب الذي تم وضعها به في الخريطة:
id = 1
name = rohan
age = 26
إذا كانت الخريطة غير القابلة للتغيير تناسب احتياجاتك ثم هناك مكتبة تسمى جوجل الجوافة (أنظر أيضا أسئلة الجوافة)
الجوافة يوفر ImmutableMap مع ترتيب التكرار المحدد من قبل المستخدم.هذا ImmutableMap يحتوي على أداء O(1) لـ يحتوي على مفتاح، احصل عليه.من الواضح أن الوضع والإزالة غير مدعومين.
ImmutableMap يتم إنشاء الكائنات باستخدام أساليب الراحة الثابتة الأنيقة ل() و نسخة من() أو أ منشئ هدف.
يمكنك الحفاظ على Map
(للبحث السريع) و List
(للطلب) ولكن أ LinkedHashMap
قد يكون أبسط.يمكنك أيضًا تجربة أ SortedMap
على سبيل المثال TreeMap
, ، والتي لديها أي أمر تحدده.
لا أعرف إذا كان مفتوح المصدر، ولكن بعد قليل من البحث في جوجل، وجدته هذا التنفيذ للخريطة باستخدام ArrayList.يبدو أنها ما قبل 1.5 Java، لذا قد ترغب في تعميمها، الأمر الذي يجب أن يكون سهلاً.لاحظ أن هذا التنفيذ لديه وصول O(N)، ولكن لا ينبغي أن يكون هذا مشكلة إذا لم تقم بإضافة مئات من عناصر واجهة المستخدم إلى JPanel، وهو ما لا ينبغي عليك فعله على أي حال.
يمكنك أن تجرب بلدي خريطة الشجرة المرتبطة تطبيق.
عندما أحتاج إلى الحفاظ على الترتيب الطبيعي للأشياء المعروفة مسبقًا، أستخدم ملفًا EnumMap
ستكون المفاتيح عبارة عن تعدادات ويمكنك إدراجها بأي ترتيب تريده ولكن عند التكرار سيتم تكرارها بترتيب التعداد (الترتيب الطبيعي).
أيضًا عند استخدام EnumMap، يجب ألا يكون هناك أي تصادمات مما قد يكون أكثر كفاءة.
أجد حقًا أن استخدام enumMap يجعل التعليمات البرمجية واضحة وقابلة للقراءة.هنا مثال
يمكنك استخدام LinkedHashMap إلى ترتيب الإدراج الرئيسي في الخريطة
النقاط المهمة حول فئة Java LinkedHashMap هي:
- أنه يحتوي على عناصر فريدة فقط.
يحتوي LinkedHashMap على قيم بناءً على المفتاح 3. قد تحتوي على مفتاح فارغ واحد وقيم خالية متعددة.4. إنه نفس HashMap الذي يحافظ على ترتيب الإدراج
public class LinkedHashMap<K,V> extends HashMap<K,V> implements Map<K,V>
ولكن إذا كنت تريد فرز القيم في الخريطة باستخدام كائن محدد من قبل المستخدم أو أي مفتاح نوع بيانات بدائي، فيجب عليك استخدامه خريطة الشجرة لمزيد من المعلومات، راجع هذا الرابط