CodeGym /وبلاگ جاوا /Random-FA /HashMap: این چه نوع نقشه ای است؟
John Squirrels
مرحله
San Francisco

HashMap: این چه نوع نقشه ای است؟

در گروه منتشر شد
سلام! در این درس، مروری دقیق‌تر در جاوا HashMap خواهیم داشت . قبلاً، ساختارهای داده را مورد مطالعه قرار داده‌ایم که در آن عناصر به عنوان خودشان ذخیره می‌شوند. در یک آرایه یا یک ArrayList / LinkedList ، تعدادی عنصر را ذخیره می کنیم. اما اگر تکلیف ما کمی تغییر کند چه؟
HashMap: این چه نوع نقشه ای است؟  - 1
کار زیر را تصور کنید: لیستی از 100 نفر ایجاد کنید که نام و شماره پاسپورت هر فرد را ذخیره می کند. در اصل، این کار چندان دشوار نیست. به عنوان مثال، می توانید هر دو را در یک رشته قرار دهید و سپس لیستی از این رشته ها ایجاد کنید: "Amelia Aguilar, 4211 717171". اما این راه حل دو اشکال دارد. اول، ممکن است به توانایی جستجو بر اساس شماره پاسپورت نیاز داشته باشیم. و این با توجه به این فرمت ذخیره سازی اطلاعات مشکل ساز خواهد بود. دوم، هیچ چیز ما را از ایجاد دو فرد متفاوت با شماره پاسپورت یکسان باز نمی دارد. و این جدی ترین نقص راه حل ما است. این هرگز نباید مجاز باشد: هیچ دو نفر شماره پاسپورت یکسانی ندارند. یک ساختار داده جدید به کمک ما می آید: نقشه . همچنین به عنوان "آرایه انجمنی" شناخته می شود، اما این اصطلاح به ندرت استفاده می شود. معمولاً به آن "فرهنگ لغت" یا "نقشه" می گویند. :) اساساً چه تفاوتی با ساختارهای داده ای دارد که قبلاً در نظر گرفتیم؟ مهمتر از همه، در این واقعیت است که داده ها در نقشه به صورت جفت کلید-مقدار ذخیره می شوند. هر چیزی می تواند به عنوان کلید و مقدار عمل کند: اعداد، رشته ها یا اشیاء کلاس های دیگر. امروز ما رایج ترین پیاده سازی کلاس Map را مطالعه خواهیم کرد : Java HashMap . HashMap: این چه نوع نقشه ای است؟  - 2

بنابراین، چه چیزی باید در مورد 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, "Bridget Logan");
       passportsAndNames.put (162348, "Ivan the Great");
       passportsAndNames.put(8082771, "Donald John Trump");
       System.out.println(passportsAndNames);
   }
}
برای این کار از متد put() استفاده می کنیم. علاوه بر این، HashMap متد toString() را لغو می کند ، بنابراین می توان آن را در کنسول نمایش داد. خروجی به این صورت خواهد بود: {212133=بریجت لوگان، 8082771=دونالد جان ترامپ، 162348=ایوان کبیر} حالا اجازه دهید بررسی کنیم که آیا کلیدها واقعا منحصر به فرد هستند؟ بیایید سعی کنیم یک عنصر جدید با کلیدی که قبلاً در نقشه استفاده شده است اضافه کنیم:
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=Bridget Logan, 8082771=Donald John Trump, 162348=Albert Kent} همانطور که می بینید، مقدار قبلی مرتبط با کلید 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() پاس داده و کلید منحصر به فرد مربوط به مقدار را remove() کنیم. برخلاف آرایه‌ها و لیست‌ها، HashMap در جاوا هیچ شاخص عددی ندارد: مقادیر با استفاده از کلید قابل دسترسی هستند. خروجی کنسول: Bridget Logan {212133= Bridget Logan, 8082771=Donald John Trump} کلاس های ArrayList و LinkedList به ما اجازه می دهند بررسی کنیم که آیا لیست حاوی عنصر خاصی است یا خیر. Java HashMap به ما این امکان را می دهد. علاوه بر این، ما می‌توانیم این کار را برای هر دو عضو جفت انجام دهیم: این همان چیزی است که متدهای containKey() (کلید را بررسی می‌کند) و containValue() (بررسی مقدار) انجام می‌شود.
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 در جاوا این واقعیت است که می‌توانید لیست‌های جداگانه‌ای از همه کلیدها و همه مقادیر را دریافت کنید. این کار با متدهای keySet() و values() انجام می شود :
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);
   }
}
کلیدها در یک مجموعه استخراج می شوند که ما هنوز به آن پرداخته ایم. از این جهت خاص است که نمی تواند حاوی عناصر تکرار شونده باشد. اکنون نکته اصلی این است که به یاد داشته باشید که لیست همه کلیدها را می توان از یک HashMap در یک مجموعه جداگانه بازیابی کرد. در مثال، ما مقادیر را در یک ArrayList معمولی ذخیره کردیم . خروجی کنسول: کلیدها: [212133, 8082771, 162348] مقادیر: [بریجیت لوگان، دونالد جان ترامپ، ایوان بزرگ] متدهای 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);
}
خروجی: 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=Bridget Logan, 8082771=Donald John Trump, 162348=Ivan the Great} اکنون ما فقط پس از بررسی اولیه به کنسول خروجی خواهیم داد. :) نکته جالب دیگر این است که دو نقشه را می توان در یک نقشه ترکیب کرد. این کار با استفاده از متد ()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=کلیفورد پاتریک، 212133=بریجت لوگان، 8082771=دونالد جان ترامپ، 925648=میچل سالگادو، 162348=ایوان کبیر} همه جفت‌های موجود در passportsAndNames2 در گذرنامه‌ها کپی شده‌اند . حالا یک مثال پیچیده تر را در نظر بگیرید. به طور خاص، تکرار بر روی HashMap در یک حلقه.
for (Map.Entry<Integer, String> entry: passportsAndNames.entrySet()) {
   System.out.println(entry);
}
کلاس Map.Entry جفت کلید-مقدار درون فرهنگ لغت را نشان می دهد. متد enterSet () لیستی از تمام جفت‌ها را در HashMap ما برمی‌گرداند . از آنجا که نقشه ما از این جفت‌های Map.Entry تشکیل شده است ، ما در حال تکرار روی جفت هستیم، نه کلیدها یا مقادیر جداگانه. خروجی: 212133=بریجت لوگان 8082771=دونالد جان ترامپ 162348=ایوان کبیر همچنین، مطالعه مستندات رسمی اوراکل برای HashMap را فراموش نکنید .
نظرات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION