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. چگونه کلیدهای نقشه را مرتب کنیم
مرتب سازی نقشه ها نیز یک عملیات نسبتاً رایج در برنامه نویسی است. شما می توانید این کار را به چند روش انجام دهید:-
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));
-
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 پیاده سازی اصلی رابط نقشه وجود دارد. هر کدام از آنها ویژگی های خاص خود را دارند:-
ترتیب عناصر
HashMap
وHashtable
تضمین نمی کنید که موارد به ترتیبی که اضافه شده اند ذخیره می شوند. علاوه بر این، آنها تضمین نمی کنند که ترتیب عناصر در طول زمان تغییر نخواهد کرد. به نوبه خود،TreeMap
ذخیره سازی عناصر را به ترتیبی که اضافه شده اند یا مطابق با یک مقایسه کننده را تضمین می کند. -
مقادیر معتبر
HashMap
به شما امکان می دهد یک کلید و یک مقدار تهی داشته باشید،HashTable
خیر. TreeMap تنها در صورتی می تواند از مقادیر null استفاده کند که مقایسه کننده اجازه دهد. بدون استفاده از مقایسه کننده (با ذخیره جفت ها به ترتیبی که اضافه شده اند)، null مجاز نیست. -
هماهنگ سازی. فقط
HashTable
هماهنگ شده، بقیه نیستند. اگر تاپیک های مختلف به نقشه دسترسی ندارند، توصیه می شود به جای HashTable از HashMap استفاده کنید.
HashMap | جدول هش | نقشه درختی | |
---|---|---|---|
ترتیب عناصر | خیر | خیر | آره |
null به عنوان مقدار | آره | خیر | نه واقعا |
ایمنی نخ | خیر | آره | خیر |
پیچیدگی الگوریتمی جستجوی عناصر | O (1) | O (1) | O (log n) |
ساختار داده در زیر کاپوت | جدول هش | جدول هش | درخت قرمز سیاه |
5. چگونه یک نقشه دو طرفه ایجاد کنیم
گاهی اوقات لازم است از یک ساختار داده استفاده شود که در آن هم کلیدها و هم مقادیر منحصر به فرد باشند، یعنی نقشه شامل جفت کلید-کلید باشد. این ساختار داده به شما این امکان را می دهد که یک "نما/جستجوی معکوس" روی نقشه ایجاد کنید. یعنی می توانیم یک کلید را با مقدار آن پیدا کنیم.به این ساختار داده نقشه دوطرفه می گویند که متاسفانه توسط JDK پشتیبانی نمی شود. اما، خوشبختانه، پیاده سازی آن را می توان در مجموعه های مشترک آپاچی یا کتابخانه های Guava یافت. در آنجا به ترتیب BidiMap و BiMap نامیده می شود. این پیاده سازی ها محدودیت هایی را بر منحصر به فرد بودن کلیدها و مقادیر اعمال می کنند. این یک رابطه یک به یک ایجاد می کند.6. چگونه یک نقشه خالی بسازیم
دو راه برای ایجاد یک نقشه خالی وجود دارد:-
مقداردهی اولیه شی معمولی:
Map<Integer, String> emptyMap = new HashMap<>();
-
ایجاد یک نقشه خالی تغییرناپذیر:
Map<Integer, String> emptyMap = Collections.emptyMap();
UnsupportedOperationException
. در این مقاله، متداولترین سوالاتی را که ممکن است هنگام استفاده از رابط نقشه برای شما پیش بیاید، بررسی کردیم.
دیگر چه بخوانیم: |
---|
GO TO FULL VERSION