JavaRush /בלוג Java /Random-HE /תשובות לשאלות הפופולריות ביותר על ממשק המפה

תשובות לשאלות הפופולריות ביותר על ממשק המפה

פורסם בקבוצה
שלום! היום ניתן תשובות לשאלות הנפוצות ביותר על מפה, אבל ראשית, בואו נזכור מה זה. תשובות לשאלות הפופולריות ביותר על ממשק המפה - 1מפה היא מבנה נתונים המכיל קבוצה של זוגות מפתח-ערך. מבנה הנתונים שלו דומה למילון, ולכן הוא נקרא לעתים קרובות כך. יחד עם זאת, Map הוא ממשק , וב-jdk הסטנדרטי הוא מכיל את המימושים העיקריים: Hashmap, LinkedHashMap, Hashtable, TreeMap. המימוש הנפוץ ביותר הוא Hashmap, אז נשתמש בו בדוגמאות שלנו. כך נראית היצירה והמילוי הסטנדרטיים של מפה:
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. כיצד למיין מפתחות מפה

מיון מפות הוא גם פעולה נפוצה למדי בתכנות. אתה יכול לעשות זאת בכמה דרכים:
  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, שלוקח 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. לכל אחד מהם מאפיינים משלו:
  1. סדר האלמנטים. HashMapואינם Hashtableמבטיחים שהפריטים יאוחסנו לפי סדר הוספתם. בנוסף, הם לא מבטיחים שסדר האלמנטים לא ישתנה עם הזמן. בתורו, TreeMapזה מבטיח אחסון של אלמנטים לפי סדר הוספתם או בהתאם להשוואה נתונה.

  2. ערכים חוקיים. HashMapמאפשר לך לקבל מפתח וערך ריק, HashTableלא. TreeMap יכול להשתמש בערכי null רק אם המשווה מאפשר זאת. ללא שימוש ב-comparator (על ידי אחסון זוגות לפי סדר הוספתם), null אסור.

  3. סִנכְּרוּן. רק HashTableמסונכרן, השאר לא. אם לא תהיה גישה למפה באמצעות שרשורים שונים, מומלץ להשתמש ב-HashMap במקום ב-HashTable.

והשוואה כללית של יישומים:
מפת גיבוב טבלת גיבוב מפת עץ
סדר האלמנטים לא לא כן
null כערך כן לא לא באמת
בטיחות חוטים לא כן לא
מורכבות אלגוריתמית של חיפוש אלמנטים O(1) O(1) O(לוג n)
מבנה נתונים מתחת למכסה המנוע טבלת גיבוב טבלת גיבוב עץ אדום-שחור

5. כיצד ליצור מפה דו כיוונית

לפעמים יש צורך להשתמש במבנה נתונים בו הן המפתחות והן הערכים יהיו ייחודיים, כלומר המפה תכיל צמדי מפתח-מפתחות. מבנה נתונים זה מאפשר לך ליצור "תצוגה/חיפוש הפוך" על המפה. כלומר, אנו יכולים למצוא מפתח לפי הערך שלו.מבנה הנתונים הזה נקרא מפה דו-כיוונית, שלצערי לא נתמכת על ידי ה-JDK. אבל, למרבה המזל, ניתן למצוא את היישום שלו באוספים הנפוצים של Apache או בספריות 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