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.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() - מחזיר אוסף של ערכים;
- entrySet() - מחזירה סט של ערכי מפתח-ערך.
ArrayList
, תבחין שיש בנאי עם ארגומנט מסוג Collection. מכיוון ש-Set הוא צאצא של Collection, ניתן להעביר את התוצאות של כל השיטות לעיל לבנאי המחלקה 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
, שלוקח Comparator בבנאי שלו. המשווה זה יוחל על מקשי המפה, כך שהמפתחות חייבים להיות מחלקות שמיישמות את הממשקComparable
:SortedMap<Integer, String> sortedMap = new TreeMap<>(new Comparator<Integer>() { @Override public int compare(Integer o1, Integer o2) { return o1 - o2; } });
וכמובן, הכל ניתן לשכתב באמצעות lambdas:
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 יישומים עיקריים של ממשק Map. לכל אחד מהם מאפיינים משלו:-
סדר האלמנטים.
HashMap
ואינםHashtable
מבטיחים שהפריטים יאוחסנו לפי סדר הוספתם. בנוסף, הם לא מבטיחים שסדר האלמנטים לא ישתנה עם הזמן. בתורו,TreeMap
זה מבטיח אחסון של אלמנטים לפי סדר הוספתם או בהתאם להשוואה נתונה. -
ערכים חוקיים.
HashMap
מאפשר לך לקבל מפתח וערך ריק,HashTable
לא. TreeMap יכול להשתמש בערכי null רק אם המשווה מאפשר זאת. ללא שימוש ב-comparator (על ידי אחסון זוגות לפי סדר הוספתם), null אסור. -
סִנכְּרוּן. רק
HashTable
מסונכרן, השאר לא. אם לא תהיה גישה למפה באמצעות שרשורים שונים, מומלץ להשתמש ב-HashMap במקום ב-HashTable.
מפת גיבוב | טבלת גיבוב | מפת עץ | |
---|---|---|---|
סדר האלמנטים | לא | לא | כן |
null כערך | כן | לא | לא באמת |
בטיחות חוטים | לא | כן | לא |
מורכבות אלגוריתמית של חיפוש אלמנטים | O(1) | O(1) | O(לוג n) |
מבנה נתונים מתחת למכסה המנוע | טבלת גיבוב | טבלת גיבוב | עץ אדום-שחור |
5. כיצד ליצור מפה דו כיוונית
לפעמים יש צורך להשתמש במבנה נתונים בו הן המפתחות והן הערכים יהיו ייחודיים, כלומר המפה תכיל צמדי מפתח-מפתחות. מבנה נתונים זה מאפשר לך ליצור "תצוגה/חיפוש הפוך" על המפה. כלומר, אנו יכולים למצוא מפתח לפי הערך שלו.מבנה הנתונים הזה נקרא מפה דו-כיוונית, שלצערי לא נתמכת על ידי ה-JDK. אבל, למרבה המזל, ניתן למצוא את היישום שלו באוספים הנפוצים של Apache או בספריות Guava. שם זה נקרא BidiMap ו-BiMap, בהתאמה. יישומים אלו מטילים מגבלות על הייחודיות של מפתחות וערכים. זה יוצר מערכת יחסים של אחד לאחד.6. כיצד ליצור מפה ריקה
ישנן שתי דרכים ליצור מפה ריקה:-
אתחול אובייקט רגיל:
Map<Integer, String> emptyMap = new HashMap<>();
-
יצירת מפה ריקה בלתי ניתנת לשינוי:
Map<Integer, String> emptyMap = Collections.emptyMap();
UnsupportedOperationException
חריגה. במאמר זה, בדקנו את השאלות הנפוצות ביותר שעשויות להיות לך בעת השימוש בממשק המפה.
מה עוד לקרוא: |
---|
GO TO FULL VERSION