JavaRush /وبلاگ جاوا /Random-FA /HashMap در جاوا - چه نوع نقشه ای است؟

HashMap در جاوا - چه نوع نقشه ای است؟

در گروه منتشر شد
سلام! امروز در مورد ساختار داده دیگری - Map صحبت خواهیم کرد. نام رسمی روسی آن "آرایه انجمنی" است، اما اغلب استفاده نمی شود. گزینه های رایج تر "فرهنگ لغت"، "نقشه" یا (اغلب) زبان عامیانه "نقشه" هستند :) در داخل نقشه، داده ها در قالب "کلید" - "مقدار" ذخیره می شوند، یعنی به صورت جفت. هم کلیدها و هم مقادیر می توانند هر شیئی باشند - اعداد، رشته ها یا اشیاء کلاس های دیگر.

تفاوت نقشه با سایر ساختارهای داده

قبلاً ساختارهای داده را بررسی کردیم که در آن عناصر به تنهایی ذخیره می شوند. در یک آرایه یا ArrayList / LinkedList تعداد معینی از عناصر را ذخیره می کنیم. اما اگر تکلیف ما کمی تغییر کند چه؟ به عنوان مثال، تصور کنید که ما با وظیفه ایجاد لیستی متشکل از 100 نفر روبرو هستیم که نام کامل و شماره پاسپورت فرد در آن ذخیره می شود. در اصل، آنقدرها هم سخت نیست. به عنوان مثال، می توانید هر دو را در یک خط قرار دهید و لیستی از خطوط را ایجاد کنید: "Anna Ivanovna Reshetnikova, 4211 717171." اما این راه حل دو اشکال دارد. اول، ممکن است به یک تابع جستجوی گذرنامه نیاز داشته باشیم. و با این فرمت برای ذخیره اطلاعات، این مشکل ساز خواهد شد. و ثانیاً هیچ چیز مانع از ایجاد دو فرد مختلف با شماره پاسپورت یکسان نمی شود. و این جدی ترین اشکال راه حل ما است. چنین موقعیت هایی باید کاملاً حذف شوند؛ هیچ دو نفر با شماره پاسپورت یکسان وجود ندارند. در اینجا Map و ویژگی‌های اعلام‌شده آن به کمک ما می‌آیند (ذخیره‌سازی داده‌ها به صورت جفت در قالب «کلید» - «مقدار»). بیایید به رایج ترین پیاده سازی Map - کلاس Java HashMap نگاه کنیم .HashMap - این چه نوع نقشه ای است؟  - 1

ایجاد HashMap در جاوا و کار با کلاس

ایجاد این پیاده سازی بسیار ساده است:
public static void main(String[] args) {

   HashMap<Integer, String> passportsAndNames = new HashMap<>();

}
در اینجا ما یک فرهنگ لغت ایجاد کرده‌ایم که در آن عناصر در قالب "رشته عددی" ذخیره می‌شوند. عدد کلید و رشته مقدار خواهد بود. ما همچنین نشان دادیم که چه نوع کلیدهایی خواهیم داشت ( Integer) و چه نوع مقادیری ( String). چرا اینطور است؟ اول، کلید در HashMap همیشه منحصر به فرد است . این برای ما عالی خواهد بود زیرا می توانیم از شماره پاسپورت به عنوان کلید استفاده کنیم و از تکراری شدن اجتناب کنیم. و خط با نام کامل به عنوان یک مقدار عمل می کند (نام کامل افراد مختلف را می توان به راحتی تکرار کرد، برای ما هیچ مشکلی وجود ندارد).

افزودن یک جفت جدید به HashMap

این کار به شکل زیر است:
public class Main {

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


       passportsAndNames.put(212133, "Lydia Arkadievna Bublikova");
       passportsAndNames.put(162348, "Ivan Mikhailovich Serebryakov");
       passportsAndNames.put(8082771, "Donald John Trump");
       System.out.println(passportsAndNames);

   }

}
روش برای این مورد استفاده می شود put(). علاوه بر این، HashMap دارای یک روش بازنویسی شده است toString()تا بتوان آن را در کنسول چاپ کرد. خروجی به این صورت خواهد بود: {212133=Lidiya Arkadyevna Bublikova, 8082771=Donald John Trump, 162348=Ivan Mikhailovich Serebryakov}

ویژگی های HashMap Keys

حالا بیایید بررسی کنیم که آیا کلیدها واقعاً منحصر به فرد هستند؟ بیایید سعی کنیم یک عنصر جدید با یک کلید از قبل در نقشه اضافه کنیم:
public static void main(String[] args) {

   HashMap<Integer, String> passportsAndNames = new HashMap<>();

   passportsAndNames.put(212133, "Lydia Arkadievna Bublikova");
   passportsAndNames.put(162348, "Ivan Mikhailovich Serebryakov");
   passportsAndNames.put(8082771, "Donald John Trump");
   passportsAndNames.put(162348, "Viktor Mikhailovich Stychkin");//repeat key

   System.out.println(passportsAndNames);

}
خروجی: {212133=Lidiya Arkadyevna Bublikova، 8082771=Donald John Trump، 162348=Viktor Mikhailovich Stychkin} عنصر قبلی با کلید 162348، همانطور که می بینید، رونویسی شد. "کلید" به دلیلی کلید نامیده شد. مقادیر در HashMap با کلید قابل دسترسی هستند (اما نه برعکس - کلید را نمی توان با مقدار بدست آورد، زیرا مقادیر را می توان کپی کرد). این به وضوح در مثال های دریافت یک عنصر و همچنین حذف یک عنصر از HashMap دیده می شود:
public static void main(String[] args) {

   HashMap<Integer, String> passportsAndNames = new HashMap<>();

   passportsAndNames.put(212133, "Lydia Arkadievna Bublikova");
   passportsAndNames.put(162348, "Ivan Mikhailovich Serebryakov");
   passportsAndNames.put(8082771, "Donald John Trump");

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


   passportsAndNames.remove(162348);
   System.out.println(passportsAndNames);

}
برای به دست آوردن یک مقدار یا حذف یک جفت از فرهنگ لغت، باید دقیقاً کلید منحصر به فرد مربوط به این مقدار را به get()متدها منتقل کنیم. در HashMap مانند آرایه ها یا لیست ها، هیچ شاخص عددی وجود ندارد - مقدار با کلید قابل دسترسی است. خروجی کنسول: Lidiya Arkadyevna Bublikova {212133=Lidiya Arkadyevna Bublikova, 8082771=Donald John Trump}remove()

بررسی وجود یک کلید و مقدار

در کلاس‌های ArrayList و LinkedList ، می‌توانیم بررسی کنیم که آیا یک لیست حاوی عنصر خاصی است یا خیر. HashMap همچنین به شما امکان انجام این کار را می دهد و برای هر دو قسمت جفت: متدهایی containsKey()(بررسی وجود یک کلید) و containsValue()(بررسی وجود یک مقدار) دارد.
public static void main(String[] args) {

   HashMap<Integer, String> passportsAndNames = new HashMap<>();

   passportsAndNames.put(212133, "Lydia Arkadievna Bublikova");
   passportsAndNames.put(162348, "Ivan Mikhailovich Serebryakov");
   passportsAndNames.put(8082771, "Donald John Trump");


   System.out.println(passportsAndNames.containsKey(11111));
   System.out.println(passportsAndNames.containsValue("Donald John Trump"));

}
خروجی: درست نادرست

دریافت لیستی از تمام کلیدها و مقادیر

یکی دیگر از ویژگی های راحت HashMap این است که می توانید به طور جداگانه لیستی از همه کلیدها و همه مقادیر را دریافت کنید . برای این، روش ها keySet()و استفاده می شود values():
public class Main {

   public static void main(String[] args) {

       HashMap<Integer, String> passportsAndNames = new HashMap<>();

       passportsAndNames.put(212133, "Lydia Arkadievna Bublikova");
       passportsAndNames.put(162348, "Ivan Mikhailovich Serebryakov");
       passportsAndNames.put(8082771, "Donald John Trump");

       Set<Integer> 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] مقادیر: [Lidiya Arkadyevna Bublikova، Donald John Trump، Ivan Mikhailovich Serebryakov] روش‌ها دقیقاً مانند ساختارهای قبلی size()انجام می‌دهند : اولی یک عنصر عددی را برمی‌گرداند. clear()فرهنگ لغت در لحظه فعلی، دومی همه عناصر را حذف می کند.
public static void main(String[] args) {

   HashMap<Integer, String> passportsAndNames = new HashMap<>();

   passportsAndNames.put(212133, "Lydia Arkadievna Bublikova");
   passportsAndNames.put(162348, "Ivan Mikhailovich Serebryakov");
   passportsAndNames.put(8082771, "Donald John Trump");

   System.out.println(passportsAndNames.size());
   passportsAndNames.clear();
   System.out.println(passportsAndNames);

}
خروجی: 3 {} برای بررسی اینکه آیا HashMap ما حداقل یک عنصر دارد، می توانیم از روش استفاده کنیم isEmpty():
public static void main(String[] args) {

   HashMap<Integer, String> passportsAndNames = new HashMap<>();

   passportsAndNames.put(212133, "Lydia Arkadievna Bublikova");
   passportsAndNames.put(162348, "Ivan Mikhailovich Serebryakov");
   passportsAndNames.put(8082771, "Donald John Trump");

   if (!passportsAndNames.isEmpty()) {

       System.out.println(passportsAndNames);

   }

}
خروجی: {212133=Lidiya Arkadyevna Bublikova, 8082771=Donald John Trump, 162348=Ivan Mikhailovich Serebryakov} اکنون فقط پس از تایید اولیه به کنسول خروجی خواهیم داد :)

ترکیب دو نقشه در یک

نکته جالب دیگر این است که دو نقشه را می توان در یک نقشه ترکیب کرد . یک روش برای این وجود دارد putAll(). ما آن را در HashMap اول فراخوانی می کنیم ، دومی را به عنوان آرگومان ارسال می کنیم و عناصر دوم به اولی اضافه می شوند:
public static void main(String[] args) {

   HashMap<Integer, String> passportsAndNames = new HashMap<>();
   HashMap<Integer, String> passportsAndNames2 = new HashMap<>();

   passportsAndNames.put(212133, "Lydia Arkadievna Bublikova");
   passportsAndNames.put(162348, "Ivan Mikhailovich Serebryakov");
   passportsAndNames.put(8082771, "Donald John Trump");

   passportsAndNames2.put(917352, "Alexey Andreevich Ermakov");
   passportsAndNames2.put(925648, "Maxim Olegovich Arkharov");


   passportsAndNames.putAll(passportsAndNames2);
   System.out.println(passportsAndNames);

}
خروجی: {917352=Alexey Andreevich Ermakov, 212133=Lidiya Arkadyevna Bublikova, 8082771=Donald John Trump, 925648=Maxim Olegovich Arkharov, 162348= Ivan Mikhailovich AllenamesportAsportAmesportsNameakov . حالا بیایید به یک مثال پیچیده تر نگاه کنیم. یعنی روی HashMap در یک حلقه تکرار کنید.
for (Map.Entry entry: passportsAndNames.entrySet()) {

   System.out.println(entry);

}
رابط Map.Entryفقط به معنای یک جفت کلید-مقدار در یک فرهنگ لغت است. این روش entrySet()فهرستی از تمام جفت‌ها را در HashMap ما برمی‌گرداند (از آنجایی که نقشه ما فقط از جفت‌های ورودی تشکیل شده است، ما روی جفت‌ها تکرار می‌کنیم، نه کلیدها یا مقادیر جداگانه). نتیجه گیری: 212133=Lidiya Arkadyevna Bublikova 8082771=Donald John Trump 162348=Ivan Mikhailovich Serebryakov این مقاله را برای آینده ذخیره کنید: https://habr.com/ru/post/128017/ حالا برای خواندن آن خیلی زود است، اما در آینده خیلی زود است، ، زمانی که از HashMap استفاده کنید، به شما کمک می کند تا بفهمید این ساختار داده از داخل چگونه کار می کند. همچنین، فراموش نکنید که اسناد رسمی اوراکل را در HashMap بررسی کنید.
نظرات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION