מדריך EnumMap

1. סקירה כללית

EnumMap הוא מַפָּה יישום שלוקח באופן בלעדי Enum כמפתחותיה.

במדריך זה נדון בתכונותיו, במקרי שימוש נפוצים ומתי עלינו להשתמש בו.

2. הגדרת פרויקט

תארו לעצמכם דרישה פשוטה שבה עלינו למפות את ימי השבוע עם הספורט שאנו משחקים באותו יום:

יום שני כדורגל יום שלישי כדורסל יום רביעי טיולי יום חמישי קראטה 

לשם כך נוכל להשתמש ב- enum:

יום ציבורי DayOfWeek {יום שני, יום שלישי, יום רביעי, יום חמישי, יום שישי, יום שבת, יום ראשון}

מה שנראה בקרוב יהיה המפתח למפה שלנו.

3. יצירה

להתחיל לחקור EnumMapראשית נצטרך להסדיר אחד:

EnumMap activityMap = EnumMap חדש (DayOfWeek.class); activityMap.put (DayOfWeek.MONDAY, "כדורגל"); 

והנה ההבדל הראשון שלנו למשהו נפוץ יותר, כמו מפת גיבוב. שים לב שעם מפת גיבוב, פרמטריזציה של הסוג מספיקה, כלומר נוכל לברוח איתה HashMap חדש (). למרות זאת, EnumMap דורש את סוג המפתח בבנאי.

3.1. EnumMap בונה העתקות

EnumMap נשלח גם עם שני בוני העתקות. הראשון לוקח עוד אחד EnumMap:

EnumMap activityMap = EnumMap חדש (DayOfWeek.class); activityMap.put (DayOfWeek.MONDAY, "כדורגל"); activityMap.put (DayOfWeek.TUESDAY, "כדורסל"); EnumMap activityMapCopy = EnumMap חדש (dayMap); assertThat (activityMapCopy.size ()). isEqualTo (2); assertThat (activityMapCopy.get (DayOfWeek.MONDAY)). isEqualTo ("כדורגל"); assertThat (activityMapCopy.get (DayOfWeek.TUESDAY)). isEqualTo ("כדורסל");

3.2. מַפָּה בונה העתקות

אוֹ, אם יש לנו לא ריק מַפָּה שהמפתח שלו הוא enum, אז נוכל לעשות זאת גם:

מפה רגילמפה = HashMap חדש (); רגיל Map.put (DayOfWeek.MONDAY, "כדורגל"); EnumMap enumMap = EnumMap חדש (רגיל מפה); assertThat (enumMap.size ()). isEqualTo (1); assertThat (enumMap.get (DayOfWeek.MONDAY)). isEqualTo ("כדורגל");

שים לב שעל המפה להיות לא ריקה כך EnumMap יכול לקבוע את סוג המפתח מתוך ערך קיים.

אם המפה שצוינה מכילה יותר מסוג enum אחד, הבנאי יזרוק ClassCastException.

4. הוספה ואחזור של אלמנטים

לאחר שמידתה EnumMap, אנחנו יכולים להוסיף את הספורט שלנו באמצעות ה- לָשִׂים() שיטה:

activityMap.put (DayOfWeek.MONDAY, "כדורגל");

וכדי לאחזר אותו, נוכל להשתמש לקבל():

assertThat (clubMap.get (DayOfWeek.MONDAY)). isEqualTo ("כדורגל");

5. בדיקת אלמנטים

כדי לבדוק אם מוגדרת מיפוי ליום מסוים, אנו משתמשים containKey ():

activityMap.put (DayOfWeek.WEDNESDAY, "טיולים רגליים"); assertThat (activityMap.containsKey (DayOfWeek.WEDNESDAY)). isTrue ();

וכדי לבדוק אם ספורט מסוים ממופה למפתח כלשהו בו אנו משתמשים containValue ():

assertThat (activityMap.containsValue ("טיולים")). isTrue (); 

5.1. ריק כערך

עַכשָׁיו, ריק הוא ערך תקף מבחינה סמנטית עבור EnumMap.

בואו נקשר ריק עם "לא עושה כלום", ומפה אותו ליום שבת:

assertThat (activityMap.containsKey (DayOfWeek.SATURDAY)). isFalse (); assertThat (activityMap.containsValue (null)). isFalse (); activityMap.put (DayOfWeek.SATURDAY, null); assertThat (activityMap.containsKey (DayOfWeek.SATURDAY)). isTrue (); assertThat (activityMap.containsValue (null)). isTrue ();

6. הסרת אלמנטים

על מנת לבטל מיפוי של יום מסוים, אנחנו פשוט לְהַסִיר() זה:

activityMap.put (DayOfWeek.MONDAY, "כדורגל"); assertThat (activityMap.remove (DayOfWeek.MONDAY)). isEqualTo ("כדורגל"); assertThat (activityMap.containsKey (DayOfWeek.MONDAY)). isFalse (); 

כפי שאנו יכולים לראות, הסר (מפתח) מחזירה את הערך הקודם המשויך למפתח, או ריק אם לא הייתה מיפוי למפתח.

אנחנו יכולים גם לבחור בטל את המפה של יום מסוים רק אם אותו יום ממופה לפעילות מסוימת:

activityMap.put (DayOfWeek.Monday, "כדורגל"); assertThat (activityMap.remove (DayOfWeek. Monday, "Hiking")). isEqualTo (false); assertThat (activityMap.remove (DayOfWeek. יום שני, "כדורגל")). isEqualTo (נכון); 

הסר (מפתח, ערך) מסיר את הערך עבור המפתח שצוין רק אם המפתח ממופה כרגע לערך שצוין.

7. תצוגות אוסף

ממש כמו עם מפות רגילות, עם כל אחת מהן EnumMap, אנו יכולים לקבל 3 תצוגות שונות או אוספי משנה.

ראשית, בואו ניצור מפה חדשה של הפעילויות שלנו:

EnumMap activityMap = EnumMap חדש (DayOfWeek.class); activityMap.put (DayOfWeek.THURSDAY, "קראטה"); activityMap.put (DayOfWeek.WEDNESDAY, "טיולים רגליים"); activityMap.put (DayOfWeek.MONDAY, "כדורגל");

7.1. ערכים

התצוגה הראשונה של מפת הפעילות שלנו היא ערכים () אשר, כפי שהשם מרמז, מחזיר את כל הערכים במפה:

ערכי אוסף = dayMap.values ​​(); assertThat (ערכים) .כיל בדיוק ("כדורגל", "טיולים", "קראטה"); 

שים לב כאן לכך EnumMap היא מפה מסודרת. הוא משתמש בסדר ה יום בשבוע enum לקביעת סדר הערכים.

7.2. סט מפתחות

בדומה לכך, סט מפתחות() מחזיר אוסף של מפתחות, שוב לפי סדר enum:

הגדר מקשים = dayMap.keySet (); assertThat (מפתחות). מכיל בדיוק (DayOfWeek.MONDAY, DayOfWeek.WEDNESDAY, DayOfWeek.SATURDAY); 

7.3. entrySet

לבסוף, entrySet () מחזירה את המיפוי בזוגות מפתח וערך:

assertThat (dayMap. 

הזמנה במפה יכולה בהחלט להיות שימושית, ואנחנו מעמיקים יותר במדריך שלנו שמשווה את TreeMap ל- HashMap.

7.4. מוטציה

כעת, זכור כי כל שינוי שנבצע במפת הפעילות המקורית יבוא לידי ביטוי בכל אחת מהשקפותיו:

activityMap.put (DayOfWeek.TUESDAY, "כדורסל"); assertThat (ערכים) .כיל בדיוק ("כדורגל", "כדורסל", "טיולים רגליים", "קראטה"); 

ולהיפך; כל שינוי שנבצע את תצוגות המשנה יבוא לידי ביטוי במפת הפעילות המקורית:

values.remove ("טיולים רגליים"); assertThat (activityMap.containsKey (DayOfWeek.WEDNESDAY)). isFalse (); assertThat (activityMap.size ()). isEqualTo (3); 

לְכָל EnumMapחוזה עם מַפָּה ממשק, תצוגות המשנה מגובות במפה המקורית.

8. מתי להשתמש EnumMap

8.1. ביצועים

באמצעות Enum כמפתח מאפשר לבצע אופטימיזציה נוספת לביצועים, כמו חישוב חשיש מהיר יותר שכן כל המקשים האפשריים ידועים מראש.

הפשטות שיש enum כאמצעי מפתח EnumMap צריך רק לגבות ג'אווה ישנה רגילה מַעֲרָך עם היגיון פשוט מאוד לאחסון ושליפה. מצד שני, גנרי מַפָּה יישומים צריכים לתת מענה לדאגות הקשורות לכך שיש אובייקט כללי כמפתח. לדוגמה, מפת גיבוב זקוק למבנה נתונים מורכב ולהיגיון אחסון ושליפה מורכבים הרבה יותר בכדי לספק אפשרות להתנגשות חשיש.

8.2. פונקציונליות

כמו כן, כפי שראינו, EnumMap היא מפה מסודרת, בכך שתצוגותיה יתחדשו בסדר האנומר. כדי לקבל התנהגות דומה לתרחישים מורכבים יותר, אנו יכולים להסתכל על TreeMap אוֹ LinkedHashMap.

9. מסקנה

במאמר זה בחנו את EnumMap יישום ה- מַפָּה מִמְשָׁק. כשעובדים עם Enum כמפתח, EnumMap יכול להיות שימושי.

קוד המקור המלא לכל הדוגמאות המשמשות במדריך זה ניתן למצוא בפרויקט GitHub.


$config[zx-auto] not found$config[zx-overlay] not found