מפת פרימיטיבים בג'אווה

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

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

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

2. אוספי ליקוי חמה

אוספי Eclipse היא מסגרת אוספים בעלת ביצועים גבוהים עבור Java. הוא מספק יישומים משופרים כמו גם כמה מבני נתונים נוספים, כולל כמה אוספים פרימיטיביים.

2.1. משתנה ובלתי משתנה מפות

בואו ליצור מפה ריקה שבה המקשים והערכים הם פרימיטיביים intס. לשם כך נשתמש ב- IntIntMaps כיתת מפעל:

MutableIntIntMap mutableIntIntMap = IntIntMaps.mutable.empty ();

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

ImmutableIntIntMap immutableIntIntMap = IntIntMaps.immutable.empty ();

אז בואו נוסיף זוג מפתח, ערך למפה המשתנה שלנו:

mutableIntIntMap.addToValue (1, 1);

כְּמוֹ כֵן, אנו יכולים ליצור מפות מעורבות עם זוגות ערך מפתח מפתח ייחוסיים ופרימיטיביים. בואו ליצור מפה עם חוּט מפתחות ו לְהַכפִּיל ערכים:

MutableObjectDoubleMap dObject = ObjectDoubleMaps.mutable.empty ();

הנה, השתמשנו ב- ObjectDoubleMaps מחלקת מפעל ליצירת מופע משתנה עבור MutableObjectDoubleMap.

עכשיו בואו נוסיף כמה ערכים:

dObject.addToValue ("מחיר", 150.5); dObject.addToValue ("איכות", 4.4); dObject.addToValue ("יציבות", 0.8);

2.2. עץ API פרימיטיבי

באוספי ליקוי חמה יש ממשק בסיס שנקרא פרימיטיבי נימוס. זהו ממשק הבסיס לכל אחד מהמיכלים הפרימיטיביים של הספרייה. כולם נקראים פרימיטיבי TypeIterable, איפה פרימיטיבי סוג יכול להיות Int, Long, קצר, בייט, לְהַשְׁחִיר, לָצוּף, לְהַכפִּיל, או בוליאני.

לכל ממשקי הבסיס הללו, עץ שלהם XYמַפָּה יישומים, כלומר חלוקה בשאלה האם המפה ניתנת לשינוי או לשינוי. כדוגמה, עבור IntIntMap, יש לנו MutableIntIntMap ו ImmutableIntIntMap.

לבסוף, כפי שראינו לעיל, יש לנו ממשקים לכיסוי כל מיני שילובים של סוגים למפתחות וערכים לערכים פרימיטיביים וגם לערכי אובייקט. כך, למשל, נוכל לקבל IntObjectMap למפתח פרימיטיבי עם לְהִתְנַגֵד ערך או ObjectIntMap למקרה ההפוך.

3. HPPC

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

3.1. דוגמה פשוטה

נתחיל ביצירת מפה שיש לה int מפתח ו ארוך ערך. השימוש בזה די מוכר:

IntLongHashMap intLongHashMap = IntLongHashMap חדש (); intLongHashMap.put (25, 1L); intLongHashMap.put (150, Long.MAX_VALUE); intLongHashMap.put (1, 0L); intLongHashMap.get (150);

HPPC מספק מפות לכל שילובי המקשים והערכים:

  • מפתח פרימיטיבי וערך פרימיטיבי
  • מפתח פרימיטיבי וערך מסוג אובייקט
  • מפתח סוג אובייקט וערך פרימיטיבי
  • גם מפתח סוג אובייקט וגם ערך

מפות מסוג אובייקטים תומכות בגנריות:

IntObjectOpenHashMap ObjectIntOpenHashMap 

למפה הראשונה יש פרימיטיבי int מפתח ו BigDecimal ערך. במפה השנייה יש LocalDate עבור המפתחות שלה ו int על ערכיו

3.2. מפות Hash לעומת מפות פיזור

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

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

כל מחלקות מפות הפיזור שומרות על אותה מוסכמות שמות כמו של מפות, אך במקום זאת משתמשים במילה לְפַזֵר:

  • IntScatterSet
  • IntIntScatterMap
  • IntObjectScatterMap

4. Fastutil

Fastutil היא מסגרת מהירה וקומפקטית המספק אוספים ספציפיים לסוג כולל מפות סוג פרימיטיביות.

4.1. דוגמה מהירה

בדומה לאוספי Eclipse ו- HPPC. Fastutil מספק גם מפות אסוציאציות פרימיטיביות לפרימיטיביות ופרימיטיביות לאובייקט.

בואו ניצור int ל בוליאני מַפָּה:

Int2BooleanMap int2BooleanMap = Int2BooleanOpenHashMap חדש ();

ועכשיו, בואו נוסיף כמה ערכים:

int2BooleanMap.put (1, נכון); int2BooleanMap.put (7, false); int2BooleanMap.put (4, נכון);

לאחר מכן אנו יכולים לאחזר ממנו ערכים:

ערך בוליאני = int2BooleanMap.get (1);

4.2. איטרציה במקום

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

Fastutil מספק חלופה המקלה מאוד על כך:

מפת Int2FloatMap = Int2FloatMap חדש (); // הוסף כאן מפתחות עבור (Int2FloatMap.Entry e: Fastutil.fastIterable (map)) {// e יעשה שימוש חוזר בכל איטרציה, כך שזה יהיה אובייקט אחד בלבד} 

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

מפה Int2FloatMap = Int2FloatMap חדש (); // הוסף מפתחות כאן Int2FloatMaps.fastForEach (מפה, e -> {// e משמש גם מחדש על פני איטרציות}); 

זה דומה מאוד לג'אווה הרגילה לכל אחד לִבנוֹת:

מפה Int2FloatMap = Int2FloatMap חדש (); // הוסף מפתחות כאן map.forEach ((מפתח, ערך) -> {// השתמש בכל מפתח / ערך ערך}); 

5. מסקנה

במאמר זה למדנו כיצד ליצור מפות פרימיטיביות בג'אווה באמצעות אוספי Eclipse, HPPC ו- Fastutil.

כמו תמיד, קוד הדוגמה למאמר זה זמין ב- GitHub.


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