מבוא לאוספי PC

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

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

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

PCollections מקביל למסגרת אוספי ג'אווה ותואמת אותה.

2. תלות

בואו נוסיף את התלות הבאה שלנו pom.xml שנוכל להשתמש באוספי PC בפרויקט שלנו:

 org.pcollections pcollections 2.1.2 

אם הפרויקט שלנו מבוסס על Gradle, נוכל להוסיף את אותו חפץ שלנו build.gradle קוֹבֶץ:

הידור 'org.pcollections: pcollections: 2.1.2'

ניתן למצוא את הגרסה האחרונה ב- Maven Central.

3. מבנה מפה (HashPMap)

HashPMap הוא מבנה נתוני מפות מתמשך. זה האנלוגי עבור java.util.HashMap משמש לאחסון נתונים ערכי מפתח שאינם אפסים.

אנחנו יכולים ליצור אינסטנט HashPMap באמצעות שיטות סטטיות נוחות ב- HashTreePMap. שיטות סטטיות אלה מחזירות א HashPMap מופע שמגובה ב- IntTreePMap.

הסטטי ריק() שיטת ה- HashTreePMap הכיתה יוצרת ריק HashPMap שאין בו אלמנטים - ממש כמו שימוש בבנאי ברירת המחדל של java.util.HashMap:

HashPMap pmap = HashTreePMap.empty ();

ישנן שתי שיטות סטטיות אחרות שנוכל להשתמש בהן כדי ליצור HashPMap. ה קְלָף בּוֹדֵד() שיטה יוצרת א HashPMap עם ערך אחד בלבד:

HashPMap pmap1 = HashTreePMap.singleton ("key1", "value1"); assertEquals (pmap1.size (), 1);

ה מ() שיטה יוצרת א HashPMap מקיים java.util.HashMap מופע (ואחרים java.util.Map יישומים):

מפת מפה = HashMap חדש (); map.put ("mkey1", "mval1"); map.put ("mkey2", "mval2"); HashPMap pmap2 = HashTreePMap.from (מפה); assertEquals (pmap2.size (), 2);

למרות ש HashPMap יורש חלק מהשיטות מ java.util.AbstractMap ו java.util.Map, יש לו שיטות ייחודיות לו.

ה מִינוּס() השיטה מסירה רשומה אחת מהמפה בזמן ש- מינוס כל () השיטה מסירה מספר ערכים. יש גם את ועוד() ו plusAll () שיטות המוסיפות ערכים בודדים ומספר ערכים בהתאמה:

HashPMap pmap = HashTreePMap.empty (); HashPMap pmap0 = pmap.plus ("key1", "value1"); מפת מפה = HashMap חדש (); map.put ("key2", "val2"); map.put ("key3", "val3"); HashPMap pmap1 = pmap0.plusAll (מפה); HashPMap pmap2 = pmap1.minus ("מפתח 1"); HashPMap pmap3 = pmap2.minusAll (map.keySet ()); assertEquals (pmap0.size (), 1); assertEquals (pmap1.size (), 3); assertFalse (pmap2.containsKey ("key1")); assertEquals (pmap3.size (), 0);

חשוב לציין את ההתקשרות לָשִׂים() עַל pmap יזרוק לא נתמךOperationException. מכיוון שאובייקטים של PCollections הם קבועים ובלתי ניתנים לשינוי, כל פעולת שינוי מחזירה מופע חדש של אובייקט (HashPMap).

נעבור לבחון מבני נתונים אחרים.

4. מבנה רשימה (TreePVector ו- ConsPStack)

TreePVector הוא אנלוגי מתמשך של java.util.ArrayList בזמן חסרון PStack הוא האנלוגי של java.util.LinkedList. TreePVector ו חסרון PStack יש שיטות סטטיות נוחות ליצירת מופעים חדשים - ממש כמו HashPMap.

ה ריק() שיטה יוצרת ריק TreePVector, בזמן ש קְלָף בּוֹדֵד() שיטה יוצרת א TreePVector עם רק אלמנט אחד. יש גם את מ() שיטה שניתן להשתמש בה כדי ליצור מופע של TreePVector מכל java.util.Collection.

חסרון PStack יש שיטות סטטיות עם אותו שם שמשיגות את אותה מטרה.

TreePVector יש שיטות לתמרן אותו. יש לו את מִינוּס() ו מינוס כל () שיטות להסרת אלמנטים (ים); ה ועוד(), ו plusAll () לתוספת של אלמנטים.

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

שיטות אלה זמינות ב חסרון PStack גם כן.

בואו ניקח בחשבון את קטע הקוד הבא המדגים את השיטות שהוזכרו לעיל:

TreePVector pVector = TreePVector.empty (); TreePVector pV1 = pVector.plus ("e1"); TreePVector pV2 = pV1.plusAll (Arrays.asList ("e2", "e3", "e4")); assertEquals (1, pV1.size ()); assertEquals (4, pV2.size ()); TreePVector pV3 = pV2.minus ("e1"); TreePVector pV4 = pV3.minusAll (Arrays.asList ("e2", "e3", "e4")); assertEquals (pV3.size (), 3); assertEquals (pV4.size (), 0); TreePVector pSub = pV2.subList (0, 2); assertTrue (pSub.contains ("e1") && pSub.contains ("e2")); TreePVector pVW = (TreePVector) pV2.with (0, "e10"); assertEquals (pVW.get (0), "e10");

בקטע הקוד שלמעלה, pSub זה אחר TreePVector חפץ והוא בלתי תלוי ב pV2. כפי שניתן לראות, pV2 לא שונה על ידי רשימת משנה () מבצע; אלא חדש TreePVector האובייקט נוצר ומלא באלמנטים של pV2 מאינדקס 0 עד 2.

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

5. הגדר מבנה (MapPSet)

MapPSet הוא אנלוגי מתמיד, מגובה מפה java.util.HashSet. ניתן לאפשר זאת באופן נוח בשיטות סטטיות של HashTreePSet - ריק(), מ() ו קְלָף בּוֹדֵד(). הם מתפקדים באותו אופן כפי שהוסבר בדוגמאות הקודמות.

MapPSet יש ל ועוד(), plusAll (), מִינוּס() ו מינוס כל () שיטות למניפולציה של נתוני קבוצה. יתר על כן, הוא יורש שיטות מ java.util.Set, java.util.AbstractCollection ו java.util.AbstractSet:

MapPSet pSet = HashTreePSet.empty () .plusAll (Arrays.asList ("e1", "e2", "e3", "e4")); assertEquals (pSet.size (), 4); MapPSet pSet1 = pSet.minus ("e4"); assertFalse (pSet1.contains ("e4"));

לבסוף, יש גם הורה PSet - השומר על סדר ההכנסה של אלמנטים ממש כמו java.util.LinkedHashSet.

6. מסקנה

לסיכום, במדריך מהיר זה בחנו את אוספי ה- PC - מבני הנתונים המתמשכים המקבילים לאוספי הליבה שיש לנו ב- Java. כמובן ש- Javadoc של PCollections מספק יותר תובנות לגבי המורכבויות של הספרייה.

וכמו תמיד, ניתן למצוא את הקוד השלם ב- Github.


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