Java Class الذي ينفذ الخريطة ويحافظ على ترتيب الإدراج؟

StackOverflow https://stackoverflow.com/questions/683518

  •  22-08-2019
  •  | 
  •  

سؤال

أنا أبحث عن فصل دراسي في جافا يحتوي على ارتباط بقيمة المفتاح، ولكن بدون استخدام التجزئة.إليك ما أفعله حاليًا:

  1. أضف القيم إلى أ Hashtable.
  2. احصل على مكرر لـ Hashtable.entrySet().
  3. التكرار من خلال جميع القيم و:
    1. احصل على Map.Entry للمكرر.
    2. إنشاء كائن من النوع Module (فئة مخصصة) بناءً على القيمة.
    3. أضف الفصل إلى JPanel.
  4. إظهار اللوحة.

تكمن المشكلة في ذلك في أنني لا أتحكم في الترتيب الذي يمكنني من خلاله استعادة القيم، لذلك لا يمكنني عرض القيم بترتيب معين (بدون ترميز الترتيب بشكل ثابت).

سأستخدم ArrayList أو Vector لهذا، ولكن لاحقًا في الكود أحتاج إلى الحصول على ملف Module كائن لمفتاح معين، وهو ما لا أستطيع فعله باستخدام ArrayList أو Vector.

هل يعرف أي شخص فئة Java مجانية/مفتوحة المصدر يمكنها القيام بذلك، أو طريقة للحصول على القيم من ملف Hashtable بناء على متى تم إضافتها؟

شكرًا!

هل كانت مفيدة؟

المحلول

أقترح أ LinkedHashMap أو أ TreeMapLinkedHashMap يحتفظ بالمفاتيح بالترتيب الذي تم إدخالها به، بينما أ 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 هي:

  1. أنه يحتوي على عناصر فريدة فقط.
  2. يحتوي LinkedHashMap على قيم بناءً على المفتاح 3. قد تحتوي على مفتاح فارغ واحد وقيم خالية متعددة.4. إنه نفس HashMap الذي يحافظ على ترتيب الإدراج

    public class LinkedHashMap<K,V> extends HashMap<K,V> implements Map<K,V> 
    

ولكن إذا كنت تريد فرز القيم في الخريطة باستخدام كائن محدد من قبل المستخدم أو أي مفتاح نوع بيانات بدائي، فيجب عليك استخدامه خريطة الشجرة لمزيد من المعلومات، راجع هذا الرابط

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top