JavaRush /وبلاگ جاوا /Random-FA /پاسخ به محبوب ترین سوالات در مورد رابط نقشه

پاسخ به محبوب ترین سوالات در مورد رابط نقشه

در گروه منتشر شد
سلام! امروز ما به متداول ترین سوالات در مورد نقشه پاسخ خواهیم داد، اما ابتدا به یاد بیاوریم که چیست. پاسخ به محبوب ترین سوالات در مورد رابط نقشه - 1نقشه یک ساختار داده است که شامل مجموعه ای از جفت های کلید-مقدار است. ساختار داده آن شبیه یک دیکشنری است، به همین دلیل است که اغلب به آن نام می‌برند. در همان زمان، Map یک رابط است و در jdk استاندارد شامل پیاده سازی های اصلی است: Hashmap، LinkedHashMap، Hashtable، TreeMap. پر استفاده ترین پیاده سازی هاشمپ است، بنابراین ما از آن در مثال های خود استفاده خواهیم کرد. ایجاد و پر کردن استاندارد یک نقشه به این صورت است:
Map<Integer, String> map = new HashMap<>();
map.put(1, "string 1");
map.put(2, "string 2");
map.put(3, "string 3");
و این نحوه بدست آوردن مقادیر با کلید است:
String string1 = map.get(1);
String string2 = map.get(2);
String string3 = map.get(3);
اگر همه موارد بالا واضح است، بیایید به پاسخ های خود به سؤالات رایج ادامه دهیم!

0. نحوه تکرار از طریق تمام مقادیر Map

تکرار بیش از مقادیر رایج ترین عملیاتی است که با نقشه ها انجام می دهید. همه جفت‌های کلید-مقدار در رابط داخلی Map.Entry ذخیره می‌شوند و برای دریافت آن‌ها باید با شماره تماس بگیرید entrySet(). مجموعه‌ای از جفت‌ها را برمی‌گرداند که می‌توان از طریق آنها حلقه زد:
for(Map.Entry<Integer, String> entry: map.entrySet()) {
   // get key
   Integer key = entry.getKey();
   // get value
   String value = entry.getValue();
}

Или используя итератор:
Iterator<Map.Entry<Integer, String>> itr = map.entrySet().iterator();
while(itr.hasNext()) {
   Map.Entry<Integer, String> entry =  itr.next();
   // get key
   Integer key = entry.getKey();
   // get value
   String value = entry.getValue();
}

1. نحوه تبدیل نقشه به لیست

رابط نقشه دارای 3 روش است که لیستی از عناصر را برمی گرداند:
  • keySet() - مجموعه ای از کلیدها را برمی گرداند.
  • values() - مجموعه ای از مقادیر را برمی گرداند.
  • enterSet() - مجموعه ای از مجموعه های کلید-مقدار را برمی گرداند.
اگر به سازنده های کلاس نگاه کنید ArrayList، متوجه خواهید شد که سازنده ای با آرگومان از نوع Collection وجود دارد. از آنجایی که Set از نسل مجموعه است، نتایج تمام متدهای بالا را می توان به سازنده کلاس منتقل کرد ArrayList. بنابراین ما لیست های جدیدی ایجاد می کنیم و آنها را با مقادیر از Map:
// key list
List<Integer> keyList = new ArrayList<>(map.keySet());
// value list
List<String> valueList = new ArrayList<>(map.values());
// key-value list
List<Map.Entry<Integer, String>> entryList = new ArrayList<>(map.entrySet());

2. چگونه کلیدهای نقشه را مرتب کنیم

مرتب سازی نقشه ها نیز یک عملیات نسبتاً رایج در برنامه نویسی است. شما می توانید این کار را به چند روش انجام دهید:
  1. Map.Entry را در یک لیست قرار دهید و آن را با استفاده از Comparator مرتب کنید .

    در مقایسه کننده فقط کلیدهای جفت را با هم مقایسه می کنیم:

    List> list = new ArrayList(map.entrySet());
    Collections.sort(list, new Comparator<Map.Entry<Integer, String>>() {
       @Override
       public int compare(Map.Entry<Integer, String> o1, Map.Entry<Integer, String> o2) {
           return o1.getKey() - o2.getKey();
       }
    });
    

    اگر لامبدا را درک می کنید، این ورودی را می توان به میزان قابل توجهی کوتاه کرد:

    Collections.sort(list, Comparator.comparingInt(Map.Entry::getKey));
  2. SortedMapاز پیاده سازی آن استفاده کنید TreeMap، که یک مقایسه کننده را در سازنده خود می گیرد. این مقایسه کننده روی کلیدهای نقشه اعمال می شود، بنابراین کلیدها باید کلاس هایی باشند که رابط را پیاده سازی کنند Comparable:

    SortedMap<Integer, String> sortedMap = new TreeMap<>(new Comparator<Integer>() {
       @Override
       public int compare(Integer o1, Integer o2) {
           return o1 - o2;
       }
    });

    و، البته، همه چیز را می توان با استفاده از لامبدا بازنویسی کرد:

    SortedMap<Integer, String> sortedMap = new TreeMap<>(Comparator.comparingInt(o -> o));

    برخلاف روش اول، با استفاده از SortedMap، ما همیشه داده ها را به صورت مرتب شده ذخیره می کنیم.

3. چگونه مقادیر نقشه را مرتب کنیم

در اینجا باید از رویکردی مشابه روش اول برای کلیدها استفاده کنید - لیستی از مقادیر را دریافت کنید و آنها را در لیست مرتب کنید:
List <Map.Entry<Integer, String>> valuesList = new ArrayList(map.entrySet());
Collections.sort(list, new Comparator<Map.Entry<Integer, String>>() {
   @Override
   public int compare(Map.Entry<Integer, String> o1, Map.Entry<Integer, String> o2) {
       return o1.getValue().compareTo(o2.getValue());
   }
});
و لامبدا برای این به نظر می رسد:
Collections.sort(list, Comparator.comparing(Map.Entry::getValue));

4. تفاوت HashMap، TreeMap و Hashtable چیست

همانطور که قبلا ذکر شد، 3 پیاده سازی اصلی رابط نقشه وجود دارد. هر کدام از آنها ویژگی های خاص خود را دارند:
  1. ترتیب عناصر HashMapو Hashtableتضمین نمی کنید که موارد به ترتیبی که اضافه شده اند ذخیره می شوند. علاوه بر این، آنها تضمین نمی کنند که ترتیب عناصر در طول زمان تغییر نخواهد کرد. به نوبه خود، TreeMapذخیره سازی عناصر را به ترتیبی که اضافه شده اند یا مطابق با یک مقایسه کننده را تضمین می کند.

  2. مقادیر معتبر HashMapبه شما امکان می دهد یک کلید و یک مقدار تهی داشته باشید، HashTableخیر. TreeMap تنها در صورتی می تواند از مقادیر null استفاده کند که مقایسه کننده اجازه دهد. بدون استفاده از مقایسه کننده (با ذخیره جفت ها به ترتیبی که اضافه شده اند)، null مجاز نیست.

  3. هماهنگ سازی. فقط HashTableهماهنگ شده، بقیه نیستند. اگر تاپیک های مختلف به نقشه دسترسی ندارند، توصیه می شود به جای HashTable از HashMap استفاده کنید.

و مقایسه کلی پیاده سازی ها:
HashMap جدول هش نقشه درختی
ترتیب عناصر خیر خیر آره
null به عنوان مقدار آره خیر نه واقعا
ایمنی نخ خیر آره خیر
پیچیدگی الگوریتمی جستجوی عناصر O (1) O (1) O (log n)
ساختار داده در زیر کاپوت جدول هش جدول هش درخت قرمز سیاه

5. چگونه یک نقشه دو طرفه ایجاد کنیم

گاهی اوقات لازم است از یک ساختار داده استفاده شود که در آن هم کلیدها و هم مقادیر منحصر به فرد باشند، یعنی نقشه شامل جفت کلید-کلید باشد. این ساختار داده به شما این امکان را می دهد که یک "نما/جستجوی معکوس" روی نقشه ایجاد کنید. یعنی می توانیم یک کلید را با مقدار آن پیدا کنیم.به این ساختار داده نقشه دوطرفه می گویند که متاسفانه توسط JDK پشتیبانی نمی شود. اما، خوشبختانه، پیاده سازی آن را می توان در مجموعه های مشترک آپاچی یا کتابخانه های Guava یافت. در آنجا به ترتیب BidiMap و BiMap نامیده می شود. این پیاده سازی ها محدودیت هایی را بر منحصر به فرد بودن کلیدها و مقادیر اعمال می کنند. این یک رابطه یک به یک ایجاد می کند.

6. چگونه یک نقشه خالی بسازیم

دو راه برای ایجاد یک نقشه خالی وجود دارد:
  1. مقداردهی اولیه شی معمولی:

    Map<Integer, String> emptyMap = new HashMap<>();
  2. ایجاد یک نقشه خالی تغییرناپذیر:

    Map<Integer, String> emptyMap =  Collections.emptyMap();
هنگامی که سعی می کنیم داده هایی را به چنین نقشه ای اضافه کنیم، موارد زیر را دریافت خواهیم کرد UnsupportedOperationException. در این مقاله، متداول‌ترین سوالاتی را که ممکن است هنگام استفاده از رابط نقشه برای شما پیش بیاید، بررسی کردیم.
نظرات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION