קבל את המפתח לערך ממפת Java

1. הקדמה

במדריך מהיר זה אנו נדגים שלוש גישות שונות לאחזור המפתח ממפה לערך נתון. נדון גם בחיוב ובשלילה של הפתרונות השונים.

למידע נוסף על מַפָּה ממשק, אתה יכול לבדוק מאמר זה.

2. גישה איטרטיבית

ה מַפָּה ממשק של אוספי ג'אווה מציע שיטה שנקראת entrySet (). הוא מחזיר את כל הערכים או זוגות ערך המפתח של המפה ב- מַעֲרֶכֶת.

הרעיון הוא לחזור על מערך הכניסה הזה ולהחזיר את המפתח שעבורו הערך תואם לערך המסופק:

get Key ציבורי (מפת מפה, ערך V) {עבור (ערך כניסה: map.entrySet ()) {if (entry.getValue (). שווה (ערך)) {return entry.getKey (); }} להחזיר null; }

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

במקרה כזה, אם נמצא ערך תואם, אנו מוסיפים את המפתח ל- a מַעֲרֶכֶת והמשיכו בלולאה. בסופו של דבר, אנו מחזירים את ה- מַעֲרֶכֶת המכיל את כל המקשים הרצויים:

ציבורי הגדר getKeys (מפת מפה, ערך V) {מקשי הגדר = HashSet חדש (); עבור (ערך כניסה: map.entrySet ()) {if (entry.getValue (). שווה (ערך)) {keys.add (entry.getKey ()); }} מקשי החזרה; }

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

3. גישה פונקציונלית

עם כניסתה של Lambda Expressions ב- Java 8, אנו יכולים לעשות זאת בצורה גמישה וקריאה יותר. אנו ממירים את מערך הכניסה ל- a זרם וספק למבדה כדי לסנן רק את הערכים עם הערך הנתון.

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

מפתחות זרם ציבוריים (מפת מפה, ערך V) {מפה חזרה .entrySet () .stream () .filter (entry -> value.equals (entry.getValue ())) .map (Map.Entry :: getKey); }

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

בנוסף, הלקוח רשאי להמיר את הזרם לכל אוסף באמצעות אספן מתאים:

זרם keyStream1 = מקשים (capitalCountryMap, "דרום אפריקה"); מחרוזת הון = keyStream1.findFirst (). Get (); זרם keyStream2 = מקשים (capitalCountryMap, "דרום אפריקה"); הגדר כותרות = keyStream2.collect (Collectors.toSet ());

4. שימוש באוספי Apache Commons

הרעיונות שלעיל לא יועילו במיוחד אם עלינו להתקשר לפונקציות בתדירות גבוהה עבור מפה מסוימת. זה יחזור שוב ושוב על מערך המפתחות שלה.

בתרחיש הזה, שמירה על מפת ערך נוספת למפתחות תהיה הגיונית יותר מכיוון שייקח זמן קבוע לאחזור המפתח לערך.

ה אוספי Commons ספרייה מאת אפאצ'י מספק דו כיווני כזה מַפָּה שקוראים לו BidiMap. יש לה שיטה בשם להשיג מפתח() לאחזור מפתח לערך נתון:

BidiMap capitalCountryMap = חדש DualHashBidiMap (); capitalCountryMap.put ("ברלין", "גרמניה"); capitalCountryMap.put ("קייפטאון", "דרום אפריקה"); מחרוזת capitalOfGermany = capitalCountryMap.getKey ("גרמניה");

למרות זאת, BidiMap מטיל יחס של 1: 1 בין המפתחות והערכים שלו. אם ננסה להכניס צמד ערך-מפתח שעבורו הערך כבר קיים ב- מַפָּה, זה מסיר את הערך הישן. במילים אחרות, הוא מעדכן את המפתח מול הערך.

כמו כן, זה דורש כמות גדולה יותר של זיכרון לצורך שמירת המפה ההפוכה.

פרטים נוספים על אופן השימוש ב- BidiMap נמצאים במדריך זה.

5. שימוש בגוגל גויאבה

אנו עשויים להשתמש בכיוון דו-כיווני אחר מַפָּה שקוראים לו BiMap נמצא בגויאבה שפותחה על ידי גוגל. מחלקה זו מספקת שיטה בשם הפוך() כדי לקבל את מפתח הערך מַפָּה או להיפך מַפָּה להביא את המפתח על בסיס ערך נתון:

HashBiMap capitalCountryMap = HashBiMap.create (); capitalCountryMap.put ("ברלין", "גרמניה"); capitalCountryMap.put ("קייפטאון", "דרום אפריקה"); מחרוזת capitalOfGermany = capitalCountryMap.inverse (). Get ("גרמניה");

כמו BidiMap, BiMap גם לא מאפשר מקשים מרובים המתייחסים לאותו ערך. אם ננסה לעשות ניסיון כזה, זה זורק א java.lang.IllegalArgumentException .

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

6. מסקנה

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

קוד המקור השלם להדרכה לעיל זמין ב- GitHub.


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