מדריך למפת גויאבה

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

במדריך זה נראה כיצד להשתמש ב- Google Guava RangeMap ממשק ויישומיו.

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

היישום הבסיסי של RangeMap הוא TreeRangeMap. באופן פנימי המפה עושה שימוש בא TreeMap כדי לאחסן את המפתח כטווח ואת הערך כאובייקט Java מותאם אישית.

2. Google גויאבה RangeMap

בואו נסתכל כיצד להשתמש ב- RangeMap מעמד.

2.1. תלות של Maven

נתחיל בהוספת תלות בספריית גויאבה של גוגל ב pom.xml:

 com.google.guava גויאבה 29.0-jre 

ניתן לבדוק כאן את הגרסה האחרונה של התלות.

3. יצירה

חלק מהדרכים בהן אנו עשויים ליצור מופע RangeMap הם:

  • להשתמש ב לִיצוֹר שיטה מה- TreeRangeMap מחלקה ליצירת מפה משתנה:
RangeMap experienceRangeDesignationMap = TreeRangeMap.create ();
  • אם בכוונתנו ליצור מפת טווח בלתי ניתנת לשינוי, השתמש ב ImmutableRangeMap מחלקה (העוקבת אחר תבנית בנאי):
RangeMap experienceRangeDesignationMap = חדש ImmutableRangeMap.builder () .put (Range.closed (0, 2), "Associate") .build (); 

4. שימוש

נתחיל בדוגמה פשוטה המציגה את השימוש ב- RangeMap.

4.1. אחזור מבוסס על קלט בטווח

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

@Test הציבור בטל givenRangeMap_whenQueryWithinRange_returnsSucessfully () {RangeMap experienceRangeDesignationMap = TreeRangeMap.create (); experienceRangeDesignationMap.put (Range.closed (0, 2), "Associate"); experienceRangeDesignationMap.put (Range.closed (3, 5), "Associate Senior"); experienceRangeDesignationMap.put (Range.closed (6, 8), "סגן נשיא"); experienceRangeDesignationMap.put (Range.closed (9, 15), "מנכ"ל"); assertEquals ("סגן נשיא", experienceRangeDesignationMap.get (6)); assertEquals ("מנכ"ל", experienceRangeDesignationMap.get (15)); }

הערה:

  • ה סָגוּר שיטת ה- טווח מחלקה מניחה שטווח הערכים השלמים יהיה בין 0 ל -2 (שניהם כולל)
  • ה טווח בדוגמה שלעיל מורכב ממספרים שלמים. אנו עשויים להשתמש במגוון מכל סוג שהוא, כל עוד הוא מיישם את ניתן להשוות ממשק כגון חוּט, אופי, עשרוני נקודה צפה וכו '.
  • RangeMap החזרות ריק כאשר אנו מנסים להשיג את הערך לטווח שאינו קיים במפה
  • במקרה של ImmutableRangeMap, טווח של מפתח אחד לא יכול לחפוף לטווח של מפתח שצריך להכניס. אם זה קורה, נקבל IllegalArgumentException
  • שני המקשים והערכים ב RangeMap לא יכול להיות ריק. אם אחד מהם הוא ריק, אנחנו מקבלים NullPointerException

4.2. הסרת ערך מבוסס על טווח

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

@Test הציבור בטל givenRangeMap_whenRemoveRangeIsCalled_removesSucessfully () {RangeMap experienceRangeDesignationMap = TreeRangeMap.create (); experienceRangeDesignationMap.put (Range.closed (0, 2), "Associate"); experienceRangeDesignationMap.put (Range.closed (3, 5), "Associate Senior"); experienceRangeDesignationMap.put (Range.closed (6, 8), "סגן נשיא"); experienceRangeDesignationMap.put (Range.closed (9, 15), "מנכ"ל"); experienceRangeDesignationMap.remove (Range.closed (9, 15)); experienceRangeDesignationMap.remove (Range.closed (1, 4)); assertNull (experienceRangeDesignationMap.get (9)); assertEquals ("Associate", experienceRangeDesignationMap.get (0)); assertEquals ("עמית בכיר", experienceRangeDesignationMap.get (5)); assertNull (experienceRangeDesignationMap.get (1)); }

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

4.3. טווח טווח המפתח

במקרה שנרצה לדעת מה הטווח הכולל של a RangeMap הוא, אנו עשויים להשתמש ב- לְהַקִיף שיטה:

@ מבחן חלל ציבורי givenRangeMap_whenSpanIsCalled_returnsSucessfully () {RangeMap experienceRangeDesignationMap = TreeRangeMap.create (); experienceRangeDesignationMap.put (Range.closed (0, 2), "Associate"); experienceRangeDesignationMap.put (Range.closed (3, 5), "Associate Senior"); experienceRangeDesignationMap.put (Range.closed (6, 8), "סגן נשיא"); experienceRangeDesignationMap.put (Range.closed (9, 15), "מנכ"ל"); experienceRangeDesignationMap.put (Range.closed (16, 30), "מנכ"ל"); טווח experienceSpan = experienceRangeDesignationMap.span (); assertEquals (0, experienceSpan.lowerEndpoint (). intValue ()); assertEquals (30, experienceSpan.upperEndpoint (). intValue ()); }

4.4. מקבל SubRangeMap

כשאנחנו רוצים לבחור חלק מ- RangeMap, אנו עשויים להשתמש ב- SubRangeMap שיטה:

@Test ציבורי בטל givenRangeMap_whenSubRangeMapIsCalled_returnsSubRangeSuccessfully () {RangeMap experienceRangeDesignationMap = TreeRangeMap.create (); experienceRangeDesignationMap .put (Range.closed (0, 2), "Associate"); experienceRangeDesignationMap .put (Range.closed (3, 5), "Associate Senior"); experienceRangeDesignationMap .put (Range.closed (6, 8), "סגן נשיא"); experienceRangeDesignationMap .put (Range.closed (8, 15), "מנכ"ל"); experienceRangeDesignationMap .put (Range.closed (16, 30), "מנכ"ל"); RangeMap experienceSubRangeDesignationMap = experienceRangeDesignationMap.subRangeMap (Range.closed (4, 14)); assertNull (מנוסהSubRangeDesignationMap.get (3)); assertTrue (מנוסהSubRangeDesignationMap.asMapOfRanges (). ערכים () .containsAll (Arrays.asList ("מנהל בכיר", "סגן נשיא", "מנכ"ל))); }

שיטה זו מחזירה את צומת ה- RangeMap עם הנתון טווח פָּרָמֶטֶר.

4.5. מקבל כְּנִיסָה

לבסוף, אם אנו מחפשים כְּנִיסָה מ RangeMap, אנו משתמשים ב- getEntry שיטה:

@Test הציבור בטל givenRangeMap_whenGetEntryIsCalled_returnsEntrySucessfully () {RangeMap experienceRangeDesignationMap = TreeRangeMap.create (); experienceRangeDesignationMap.put (Range.closed (0, 2), "Associate"); experienceRangeDesignationMap.put (Range.closed (3, 5), "Associate Senior"); experienceRangeDesignationMap.put (Range.closed (6, 8), "סגן נשיא"); experienceRangeDesignationMap.put (Range.closed (9, 15), "מנכ"ל"); מפה. כניסה experienceEntry = experienceRangeDesignationMap.getEntry (10); assertEquals (Range.closed (9, 15), experienceEntry.getKey ()); assertEquals ("מנהל בכיר", experienceEntry.getValue ()); }

5. מסקנה

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

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


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