CodeGym /مدونة جافا /Random-AR /HashMap: ما نوع هذه الخريطة؟
John Squirrels
مستوى
San Francisco

HashMap: ما نوع هذه الخريطة؟

نشرت في المجموعة
أهلاً! في هذا الدرس، سنلقي نظرة فاحصة على Java HashMap . لقد قمنا سابقًا بدراسة هياكل البيانات حيث يتم تخزين العناصر بنفسها. في مصفوفة أو ArrayList / LinkedList ، نقوم بتخزين عدد معين من العناصر. ولكن ماذا لو تغيرت مهمتنا قليلاً؟
HashMap: ما نوع هذه الخريطة؟  - 1
تخيل المهمة التالية: إنشاء قائمة تضم 100 شخص تخزن فيها اسم كل شخص ورقم جواز سفره. من حيث المبدأ، هذا ليس بالأمر الصعب. على سبيل المثال، يمكنك إدخال كليهما في سلسلة، ثم إنشاء قائمة بهذه السلاسل: "Amelia Aguilar, 4211 717171". لكن هذا الحل له عيبان. أولاً، قد نحتاج إلى إمكانية البحث عن طريق رقم جواز السفر. وسيكون هذا مشكلة نظرًا لتنسيق تخزين المعلومات هذا. ثانيًا، لا شيء يمنعنا من إنشاء شخصين مختلفين بنفس رقم جواز السفر. وهذا هو العيب الأكثر خطورة في حلنا. لا ينبغي السماح بذلك أبدًا: لا يوجد شخصان لهما نفس رقم جواز السفر. تأتي بنية بيانات جديدة لمساعدتنا: Map . يُعرف أيضًا باسم "المصفوفة النقابية"، لكن هذا المصطلح نادرًا ما يستخدم. والأكثر شيوعًا، يطلق عليه "القاموس" أو "الخريطة". :) كيف يختلف جوهريًا عن هياكل البيانات التي نظرنا فيها سابقًا؟ قبل كل شيء، يتم تخزين البيانات الموجودة في الخريطة كأزواج قيمة مفتاحية. يمكن لأي شيء أن يكون بمثابة مفاتيح وقيم: أرقام، سلاسل، أو كائنات من فئات أخرى. سندرس اليوم التطبيق الأكثر شيوعًا لفئة Map : Java HashMap . HashMap: ما نوع هذه الخريطة؟  - 2

إذًا، ما الذي نحتاج إلى معرفته حول HashMap في Java؟

من السهل جدًا إنشاء:
public static void main(String[] args) {
   HashMap<Integer, String> passportsAndNames = new HashMap<>();
}
نقوم هنا بإنشاء قاموس يقوم بتخزين العناصر كأزواج "سلسلة أرقام". سيكون الرقم بمثابة المفتاح، والسلسلة كقيمة. كما نحدد نوع المفتاح (عدد صحيح) ونوع القيمة (سلسلة). لماذا؟ أولاً، يكون مفتاح HashMap فريدًا دائمًا. وهذا يناسبنا تمامًا، حيث يمكننا استخدام رقم جواز السفر كمفتاح وتجنب التكرارات. ستكون القيمة عبارة عن سلسلة بالاسم الكامل (يمكن أن يكون لأشخاص مختلفين نفس الاسم، وهذا لا داعي للقلق). تبدو إضافة زوج جديد إلى HashMap كما يلي:
public class Main {

   public static void main(String[] args) {
       HashMap<Integer, String> passportsAndNames = new HashMap<>();

       passportsAndNames.put (212133, "Bridget Logan");
       passportsAndNames.put (162348, "Ivan the Great");
       passportsAndNames.put(8082771, "Donald John Trump");
       System.out.println(passportsAndNames);
   }
}
نستخدم الطريقة put() لهذا الغرض. بالإضافة إلى ذلك، يتجاوز HashMap طريقة toString() ، بحيث يمكن عرضه على وحدة التحكم. ستبدو النتيجة كما يلي: {212133=Bridget Logan, 8082771=Donald John Trump, 162348=Ivan the Great} الآن دعونا نتحقق مما إذا كانت المفاتيح فريدة حقًا؟ فلنحاول إضافة عنصر جديد بمفتاح تم استخدامه بالفعل في الخريطة:
public static void main(String[] args) {
   HashMap<Integer, String> passportsAndNames = new HashMap<>();

   passportsAndNames.put (212133, "Bridget Logan");
   passportsAndNames.put (162348, "Ivan the Great");
   passportsAndNames.put(8082771, "Donald John Trump");
   passportsAndNames.put(162348, "Albert Kent");// This key has already been used
   System.out.println(passportsAndNames);
}
الإخراج: {212133=بريدجيت لوجان، 8082771=دونالد جون ترامب، 162348=ألبرت كينت} كما ترون، تمت الكتابة فوق القيمة السابقة المرتبطة بالمفتاح 162348 . نحن نستخدم مصطلح "المفتاح" لسبب ما. يتم الوصول إلى القيم الموجودة في HashMap باستخدام المفتاح، ولكن ليس العكس. لا يمكن الحصول على المفتاح باستخدام قيمة، لأن القيم قد لا تكون فريدة. يمكن رؤية ذلك بوضوح عند الحصول على عنصر أو إزالته من HashMap :
public static void main(String[] args) {
   HashMap<Integer, String> passportsAndNames = new HashMap<>();

   passportsAndNames.put (212133, "Bridget Logan");
   passportsAndNames.put (162348, "Ivan the Great");
   passportsAndNames.put(8082771, "Donald John Trump");

   String lidiaName = passportsAndNames.get(212133);
   System.out.println(lidiaName);

   passportsAndNames.remove(162348);
   System.out.println(passportsAndNames);
}
للحصول على قيمة أو إزالة زوج من القاموس، يجب أن نمرر إلى get() ونزيل () المفتاح الفريد الذي يتوافق مع القيمة. على عكس المصفوفات والقوائم، لا تحتوي HashMap في Java على مؤشرات رقمية: يتم الوصول إلى القيم باستخدام المفتاح. مخرجات وحدة التحكم: Bridget Logan {212133=Bridget Logan, 8082771=Donald John Trump} تتيح لنا فئتا ArrayList و LinkedList التحقق مما إذا كانت القائمة تحتوي على أي عنصر معين. يتيح لنا Java HashMap القيام بذلك. والأكثر من ذلك، يمكننا القيام بذلك لكلا العضوين في الزوج: هذا هو الغرض من الأساليب يحتوي على مفتاح () (التحقق من وجود مفتاح) و يحتوي على قيمة () (التحقق من قيمة).
public static void main(String[] args) {
   HashMap<Integer, String> passportsAndNames = new HashMap<>();

   passportsAndNames.put (212133, "Bridget Logan");
   passportsAndNames.put (162348, "Ivan the Great");
   passportsAndNames.put(8082771, "Donald John Trump");

   System.out.println(passportsAndNames.containsKey(11111));
   System.out.println(passportsAndNames.containsValue("Donald John Trump"));
}
الإخراج: false true ميزة أخرى ملائمة لـ HashMap في Java هي حقيقة أنه يمكنك الحصول على قوائم منفصلة بجميع المفاتيح وجميع القيم. ويتم تحقيق ذلك باستخدام الأساليب keySet() والقيم () :
public class Main {

   public static void main(String[] args) {
       HashMap<Integer, String> passportsAndNames = new HashMap<>();

       passportsAndNames.put (212133, "Bridget Logan");
       passportsAndNames.put (162348, "Ivan the Great");
       passportsAndNames.put(8082771, "Donald John Trump");

       Set keys = passportsAndNames.keySet();
       System.out.println("Keys: " + keys);

       ArrayList<String> values = new ArrayList<>(passportsAndNames.values());
       System.out.println("Values: " + values);
   }
}
يتم استخراج المفاتيح في Set ، والتي لم نقم بتغطيتها بعد. إنه خاص لأنه لا يمكن أن يحتوي على عناصر متكررة. الشيء الرئيسي الآن هو أن تتذكر أنه يمكن استرجاع قائمة جميع المفاتيح من HashMap إلى مجموعة منفصلة. في المثال، قمنا بحفظ القيم في ArrayList عادية . مخرجات وحدة التحكم: المفاتيح: [212133، 8082771، 162348] القيم: [Bridget Logan, Donald John Trump, Ivan the Great] تقوم أساليب size () و clear() بنفس الشيء تمامًا كما في الهياكل السابقة التي ناقشناها: يقوم الأول بإرجاع عدد العناصر الموجودة حاليًا في القاموس، بينما يقوم الثاني بإزالة جميع العناصر.
public static void main(String[] args) {
   HashMap<Integer, String> passportsAndNames = new HashMap<>();

   passportsAndNames.put (212133, "Bridget Logan");
   passportsAndNames.put (162348, "Ivan the Great");
   passportsAndNames.put(8082771, "Donald John Trump");

   System.out.println(passportsAndNames.size());
   passportsAndNames.clear();
   System.out.println(passportsAndNames);
}
Output: 3 {} للتحقق مما إذا كان هناك عنصر واحد على الأقل في HashMap لدينا ، يمكننا استخدام طريقة isEmpty() :
public static void main(String[] args) {
   HashMap<Integer, String> passportsAndNames = new HashMap<>();

   passportsAndNames.put (212133, "Bridget Logan");
   passportsAndNames.put (162348, "Ivan the Great");
   passportsAndNames.put(8082771, "Donald John Trump");

   if (!passportsAndNames.isEmpty()) {

       System.out.println(passportsAndNames);
   }
}
الإخراج: {212133=بريدجيت لوجان، 8082771=دونالد جون ترامب، 162348=إيفان العظيم} الآن لن نقوم بالإخراج إلى وحدة التحكم إلا بعد إجراء فحص أولي. :) هناك نقطة أخرى مثيرة للاهتمام وهي أنه يمكن دمج خريطتين في خريطة واحدة. تم تحقيق ذلك باستخدام طريقة putAll() . نسميها على HashMap الأول ، ونمرر الثاني كوسيطة، وتضاف عناصر الثاني إلى الأول:
public static void main(String[] args) {
   HashMap<Integer, String> passportsAndNames = new HashMap<>();
   HashMap<Integer, String> passportsAndNames2 = new HashMap<>();

   passportsAndNames.put (212133, "Bridget Logan");
   passportsAndNames.put (162348, "Ivan the Great");
   passportsAndNames.put(8082771, "Donald John Trump");

   passportsAndNames2.put(917352, "Clifford Patrick");
   passportsAndNames2.put(925648, "Mitchell Salgado");

   passportsAndNames.putAll(passportsAndNames2);
   System.out.println(passportsAndNames);
}
الإخراج: {917352=Clifford Patrick, 212133=Bridget Logan, 8082771=Donald John Trump, 925648=Mitchell Salgado, 162348=Ivan the Great} تم نسخ جميع الأزواج الموجودة في جوازات السفر AndNames2 إلى جوازات السفر AndNames . الآن فكر في مثال أكثر تعقيدًا. على وجه التحديد، التكرار عبر HashMap في حلقة.
for (Map.Entry<Integer, String> entry: passportsAndNames.entrySet()) {
   System.out.println(entry);
}
تشير فئة Map.Entry إلى زوج المفتاح والقيمة داخل القاموس. تقوم طريقة الإدخال () بإرجاع قائمة بجميع الأزواج في HashMap الخاص بنا . نظرًا لأن خريطتنا تتكون من أزواج Map.Entry هذه ، فإننا نكررها على أزواج، وليس على مفاتيح أو قيم منفصلة. الإخراج: 212133=بريدجيت لوجان 8082771=دونالد جون ترامب 162348=إيفان العظيم أيضًا، لا تنس دراسة وثائق Oracle الرسمية لـ HashMap .
تعليقات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION