מפת ג'אווה עם מקשים שאינם רגישים לאותיות רישיות

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

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

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

2. מבט מקרוב על מַפָּה עם מקשים שאינם רגישים לאותיות רישיות

בואו נבדוק את הבעיה שאנו מנסים לפתור ביתר פירוט.

נניח שיש לנו מַפָּה עם כניסה אחת:

בואו נוסיף את הערך הבא:

map.put ("ABC", 2);

כשעובדים עם א מַפָּה עם מקשים הרגישים לאותיות רישיות, נקבל שני ערכים:

אבל כשעובדים עם א מַפָּה עם מקשים שאינם רגישים לאותיות רישיות, התוכן יהיה:

בדוגמאות הבאות נצלול ליישומים שאינם רגישים לאותם מקרים של כמה פופולריים מַפָּה יישומים: TreeMap, מפת גיבוב, ו LinkedHashMap.

3. TreeMap

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

לָכֵן, אם אנו מספקים רגישות לאותיות רישיות חוּטמשווה, נקבל רגישות לאותיות רישיות TreeMap.

לְמַרְבֶּה הַמַזָל, חוּט כבר מספק את הסטטי הזה משווה:

השוואה הסופית הסטטית הציבורית CASE_INSENSITIVE_ORDER

שנוכל לספק לבנאי:

מפת treeMap = מפת עץ חדשה (String.CASE_INSENSITIVE_ORDER); treeMap.put ("abc", 1); treeMap.put ("ABC", 2);

ועכשיו, כשאנחנו מבצעים בדיקות, אנחנו יכולים לראות שגודל ה- מַפָּה אחד:

assertEquals (1, treeMap.size ());

והערך עודכן ל -2:

assertEquals (2, treeMap.get ("aBc"). intValue ()); assertEquals (2, treeMap.get ("ABc"). intValue ());

עכשיו נסיר את הערך, באמצעות אותו חוּט, אך עם מקרה אחר:

treeMap.remove ("aBC"); assertEquals (0, treeMap.size ());

עלינו לזכור זאת פונקציות כמו לָשִׂים ו לקבל עלות זמן ממוצע של O (log n) בשביל ה TreeMap לעומת א מפת גיבוב המספק הכנסה וחיפוש O (1).

ראוי גם לציין זאת TreeMap לא מאפשר ריק מקשים.

4. אפאצ'י CaseInsensitiveMap

Apache's Commons-Collections היא ספריית Java פופולרית מאוד, המספקת מספר רב של שיעורים שימושיים עם CaseInsensitiveMap ביניהם.

CaseInsensitiveMap הוא מבוסס חשיש מַפָּה, הממיר מקשים לאותיות קטנות לפני שהם מתווספים או מאוחסנים. בניגוד TreeMap, CaseInsensitiveMap מאפשר ריק הכנסת מפתח.

ראשית, עלינו להוסיף את 4 תלות:

 org.apache.commons commons-collection4 4.4 

עכשיו, אנחנו יכולים להשתמש CaseInsensitiveMap והוסף שני ערכים:

מפה commonsHashMap = CaseInsensitiveMap חדש (); commonsHashMap.put ("abc", 1); commonsHashMap.put ("ABC", 2);

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

assertEquals (1, commonsHashMap.size ()); assertEquals (2, commonsHashMap.get ("aBc"). intValue ()); assertEquals (2, commonsHashMap.get ("ABc"). intValue ()); commonsHashMap.remove ("aBC"); assertEquals (0, commonsHashMap.size ());

5. האביב LinkedCaseInsensitiveMap

Spring Core הוא מודול Spring Framework המספק גם שיעורי שירות, כולל LinkedCaseInsensitiveMap.

LinkedCaseInsensitiveMap עוטף א LinkedHashMap, שהוא א מַפָּה מבוסס על טבלת hash ורשימה מקושרת. בניגוד LinkedHashMap, זה לא מאפשר ריק הכנסת מפתח. LinkedCaseInsensitiveMap שומר על הסדר המקורי כמו גם על מעטפת המקשים המקורית תוך מתן פונקציות שיחות כמו לקבל ו לְהַסִיר בכל מקרה.

ראשית, בואו נוסיף את ליבת קפיץ תלות:

 org.springframework spring-core 5.2.5.RELEASE 

כעת אנו יכולים לאתחל חדש LinkedCaseInsensitiveMap:

מפה linkedHashMap = חדש LinkedCaseInsensitiveMap (); linkedHashMap.put ("abc", 1); linkedHashMap.put ("ABC", 2);

הוסף לבדוק את זה:

assertEquals (1, linkedHashMap.size ()); assertEquals (2, linkedHashMap.get ("aBc"). intValue ()); assertEquals (2, linkedHashMap.get ("ABc"). intValue ()); linkedHashMap.remove ("aBC"); assertEquals (0, linkedHashMap.size ());

6. מסקנה

במדריך זה בדקנו דרכים שונות ליצור Java מַפָּה עם מקשים שאינם רגישים לאותיות רישיות והשתמשו בכיתות שונות כדי להשיג זאת.

כמו תמיד, הקוד זמין ב- GitHub.


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