JavaRush /مدونة جافا /Random-AR /أهم 9 أسئلة حول الخريطة في جافا
Treefeed
مستوى

أهم 9 أسئلة حول الخريطة في جافا

نشرت في المجموعة
تذكر أن الخريطة عبارة عن بيانات منظمة تتكون من مجموعة من أزواج المفتاح والقيمة، ولا يمكن استخدام كل مفتاح إلا مرة واحدة في خريطة واحدة. يغطي هذا الموضوع 9 أسئلة أساسية حول استخدام Map في Java وفئاتها المنفذة. للتبسيط، سأستخدم التعميمات في الأمثلة . لذلك، سأكتب ببساطة Map، دون تحديد محدد الخريطة. ولكن يمكنك أن تفترض أن كلا القيمتين K و V قابلتان للمقارنة، مما يعني أن K يمتد Comparable و V يمتد أيضًا Comparable .أهم 9 أسئلة حول الخريطة في Java - 1

0. تحويل الخريطة إلى قائمة

في Java، توفر واجهة Map ثلاثة أنواع من المجموعات: مجموعة المفاتيح، ومجموعة القيمة، ومجموعة القيمة الرئيسية. يمكن تحويلها جميعًا إلى قائمة باستخدام المُنشئ أو الطريقة addAll(). يوضح مقتطف التعليمات البرمجية التالي كيفية إنشاء قائمة ArrayList من الخريطة.
// list of keys
List keyList = new ArrayList(Map.keySet());
//list of values
List valueList = new ArrayList(Map.valueSet());
//list key-value
List entryList = new ArrayList(Map.entrySet());

1. قم بالتمرير عبر جميع القيم الموجودة في الخريطة

يعد التنقل عبر كل زوج من أزواج القيمة الأساسية هو الإجراء الأساسي للتجول عبر الخريطة. في Java، يتم تخزين كل زوج في حقل Map يسمى Map.Entry . Map.entrySet()تُرجع مجموعة من القيم الأساسية، وبالتالي فإن الطريقة الأكثر فعالية للتكرار عبر جميع قيم الخريطة هي:
for(Entry entry: Map.entrySet()) {
  //get the key
  K key = entry.getKey();
  //get value
  V value = entry.getValue();
}
يمكننا أيضًا استخدام Iterator، خاصة في الإصدارات الأقدم من JDK 1.5
Iterator itr = Map.entrySet().iterator();
while(itr.hasNext()) {
  Entry entry = itr.next();
  //get the key
  K key = entry.getKey();
  //get value
  V value = entry.getValue();
}

2. ترتيب الخريطة عن طريق المفاتيح

يعد تنظيم الخرائط حسب المفاتيح إجراءً آخر شائع الاستخدام. الطريقة الأولى هي إضافة Map.Entry إلى القائمة، والفرز باستخدام مقارن يقوم بالفرز حسب القيم.
List list = new ArrayList(Map.entrySet());
Collections.sort(list, new Comparator() {

  @Override
  public int compare(Entry e1, Entry e2) {
    return e1.getKey().compareTo(e2.getKey());
  }
});
طريقة أخرى: استخدم SortedMap ، الذي يقوم أيضًا بترتيب مفاتيحه بالترتيب. ولكن، يجب أن تجسد جميع المفاتيح قابلة للمقارنة أو مقبولة من قبل المقارنة. إحدى الفئات المنفذة SortedMapهي TreeMap . يقبل منشئه المقارنة. يوضح الكود التالي كيفية تحويل واحد عادي Mapإلى أمر مرتب.
SortedMap sortedMap = new TreeMap(new Comparator() {

  @Override
  public int compare(K k1, K k2) {
    return k1.compareTo(k2);
  }

});
sortedMap.putAll(Map);

3. ترتيب الخريطة حسب القيم

تعمل إضافة خريطة إلى القائمة ثم فرزها في هذه الحالة، ولكن هذه المرة تحتاج إلى استخدام Entry.getValue(). الكود أدناه هو نفسه تقريبًا كما كان من قبل.
List list = new ArrayList(Map.entrySet());
Collections.sort(list, new Comparator() {

  @Override
  public int compare(Entry e1, Entry e2) {
    return e1.getValue().compareTo(e2.getValue());
  }

});
لا يزال بإمكاننا استخدامه SortedMapفي هذه الحالة، ولكن فقط إذا كانت القيم فريدة. في هذه الحالة، يمكنك تحويل زوج القيمة الرئيسية إلى قيمة مفتاح. هذا الحل له قيود شديدة ولا أوصي به.

4. تهيئة خريطة ثابتة/غير قابلة للتغيير

عندما تريد أن تظل الخريطة غير قابلة للتغيير، فإن الطريقة الجيدة هي نسخها إلى خريطة غير قابلة للتغيير. ستساعدك تقنية البرمجة الدفاعية هذه على إنشاء خريطة ليست آمنة للاستخدام فحسب، بل آمنة أيضًا لسلسلة المحادثات. لتهيئة خريطة ثابتة/غير قابلة للتغيير، يمكننا استخدام مُهيئ static(انظر أدناه). المشكلة في هذا الرمز هي أنه على الرغم من تعريف الخريطة كـ static final، إلا أنه لا يزال بإمكاننا العمل معها بعد التهيئة، على سبيل المثال Test.Map.put(3,"three");. لذا فهي ليست ثباتًا حقيقيًا. لإنشاء خريطة غير قابلة للتغيير باستخدام مُهيئ ثابت، نحتاج إلى فئة مجهولة للغاية، والتي سنضيفها إلى الخريطة غير القابلة للتغيير في خطوة التهيئة الأخيرة. يرجى إلقاء نظرة على الجزء الثاني من الكود. عندما يتم طرح UnsupportedOperationException إذا قمت بتشغيل Test.Map.put(3,"three");.
public class Test {

  private static final Map Map;
  static {
    Map = new HashMap();
    Map.put(1, "one");
    Map.put(2, "two");
  }
}
public class Test {

  private static final Map Map;
  static {
    Map aMap = new HashMap();
    aMap.put(1, "one");
    aMap.put(2, "two");
    Map = Collections.unmodifiableMap(aMap);
  }
}
تدعم مكتبة Guava أيضًا طرقًا مختلفة لتهيئة المجموعات الثابتة وغير القابلة للتغيير. لمعرفة المزيد حول فوائد أداة المجموعات غير القابلة للتغيير في Guava، راجع قسم المجموعات غير القابلة للتغيير في دليل Guava الإرشادي .

5. الفرق بين HashMap وTreeMap وHashtable

هناك ثلاثة تطبيقات رئيسية لواجهة الخريطة في Java: HashMap و TreeMap و Hashtable . الاختلافات الرئيسية هي كما يلي:
  • ترتيب المرور . لا يضمن HashMap وHashTable ترتيب الخريطة؛ وعلى وجه الخصوص، فإنها لا تضمن بقاء الطلب كما هو مع مرور الوقت. لكنه TreeMapسيرتب جميع القيم "بالترتيب الطبيعي" للمفاتيح أو عن طريق المقارنة.
  • أزواج قيمة المفتاح الصالحة. HashMapيسمح لك بالحصول على مفتاح فارغ وقيمة فارغة. HashTableلا يسمح بمفتاح فارغ أو قيمة فارغة. إذا TreeMapتم استخدام الترتيب الطبيعي أو أن المقارنة لا تسمح بمفتاح فارغ، فسيتم طرح استثناء.
  • التزامن . متزامنة فقط HashTable، والباقي ليس كذلك. ولكن، "إذا لم تكن هناك حاجة إلى تطبيق آمن لمؤشر الترابط، فمن المستحسن استخدام " HashMapبدلاً من ذلك HashTable.
مقارنة أكثر تفصيلا
.                       | HashMap | HashTable | TreeMap
-------------------------------------------------------

Упорядочивание          |нет      |нет        | да
null в ключ-meaning    | да-да   | нет-нет   | нет-да
синхронизировано        | нет     | да        | нет
производительность      | O(1)    | O(1)      | O(log n)
воплощение              | корзины | корзины   | красно-чёрное дерево
اقرأ المزيد عن العلاقة بين HashMap وHashMap . خريطة الشجرة مقابل. جدول التجزئة مقابل. لينكيدهاش ماب .

6. خريطة مع البحث / العرض العكسي

في بعض الأحيان، نحتاج إلى مجموعة من أزواج المفاتيح، مما يعني أن القيم فريدة مثل المفاتيح (نمط واحد لواحد). يتيح لك هذا الاتساق إنشاء "عرض/بحث مقلوب" على الخريطة. أي أنه يمكننا العثور على المفتاح بقيمته. تسمى بنية البيانات هذه خريطة ثنائية الاتجاه ، وهي للأسف غير مدعومة من قبل JDK. تقدم كل من Apache Common Collections وGuava تطبيقات خرائط ثنائية الاتجاه تسمى BidiMap وBiMap، على التوالي. يقدم كلاهما قيدًا يفرض تعيينًا بنسبة 1:1 بين المفاتيح والقيم.

7. نسخة سطحية من الخريطة

تحتوي جميع الخرائط الموجودة في Java تقريبًا، إن لم يكن كلها، على مُنشئ نسخة لخريطة أخرى. لكن إجراء النسخ غير متزامن. مما يعني أنه عندما يقوم أحد الخيوط بنسخ خريطة، يمكن لخيط آخر تغيير بنيته. ولمنع إلغاء تزامن النسخ المفاجئ، ينبغي استخدام أحدهما في مثل هذه الحالة Collections.synchronizedMap().
Map copiedMap = Collections.synchronizedMap(Map);
هناك طريقة أخرى مثيرة للاهتمام للنسخ السطحي وهي استخدام ملحق clone(). ولكن لا ينصح به حتى من قبل منشئ إطار عمل مجموعات Java، جوشوا بلوخ. في مناظرة " Copy Constructor vs. Cloning "، اتخذ الموقف: اقتباس: "غالبًا ما أقدم طريقة استنساخ عامة في فصول محددة لأن الناس يتوقعون وجودها. ... إنه لأمر مخز أن يتم كسر الاستنساخ، لكنه لقد حدث ذلك... الاستنساخ هو نقطة ضعف، وأعتقد أنه يجب تحذير الناس بشأن حدوده." لهذا السبب، لا أوضح لك حتى كيفية استخدام طريقة clone()نسخ Map

8. قم بإنشاء خريطة فارغة

إذا Mapكان غير قابل للتغيير، استخدم:
Map = Collections.emptyMap();
أو استخدم أي تجسيد آخر. على سبيل المثال:
Map = new HashMap();
نهاية
تعليقات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION