הגדר פעולות ב- Java

1. הקדמה

סט הוא דרך שימושית לייצג אוסף ייחודי של פריטים.

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

2. קצת תורת הקבוצות

2.1. מהו סט?

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

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

בואו נשתמש בשתי קבוצות של מספרים שלמים כדוגמה פשוטה:

setA: {1, 2, 3, 4} setB: {2, 4, 6, 8}

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

דיאגרמות כמו אלה מכונות דיאגרמות של ון ונותנות לנו דרך שימושית להראות אינטראקציות בין קבוצות כפי שנראה בהמשך.

2.2. צומת הסטים

התנאי הִצטַלְבוּת פירושו ערכים משותפים של קבוצות שונות.

אנו יכולים לראות כי המספרים השלמים 2 ו -4 קיימים בשתי הערכות. אז הצומת של setA ו- setB הוא 2 ו -4 מכיוון שאלו הערכים המשותפים לשתי הערכות שלנו.

setA צומת setB = {2, 4}

על מנת להציג את הצומת בתרשים, אנו ממזגים את שתי הסטים שלנו ומדגישים את האזור המשותף לשתי הערכות שלנו:

2.3. איחוד הסטים

התנאי הִתאַחֲדוּת פירושו שילוב ערכים של קבוצות שונות.

אז בואו ניצור סט חדש שהוא האיחוד בין ערכות הדוגמה שלנו. אנחנו כבר יודעים שלא יכולים להיות לנו ערכים כפולים בערכה. עם זאת, לסטים שלנו יש כמה ערכים כפולים (2 ו -4). לכן כאשר אנו משלבים את התוכן של שתי הערכות, עלינו לוודא שמסירים כפילויות. אז בסופו של דבר אנחנו עם 1, 2, 3, 4, 6 ו -8.

setA איחוד setB = {1, 2, 3, 4, 6, 8}

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

2.4. ההשלמה היחסית של סטים

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

עכשיו בואו ניצור קבוצות חדשות שהן המשלים היחסיים של setA ו setB.

השלמה יחסית של setA ב- setB = {6, 8} השלמה יחסית של setB ב- setA = {1, 3}

ועכשיו, בואו נדגיש את האזור ב setA זה לא חלק setB. זה נותן לנו את ההשלמה היחסית של setB ב setA:

2.5. ערכת המשנה וסופר-סט

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

3. יישום פעולות סט עם java.util.Set

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

סט סט פרטיA = setOf (1,2,3,4); סט סט פרטי B = setOf (2,4,6,8); סט סטטי פרטי setOf (Integer ... ערכים) {להחזיר HashSet חדש (Arrays.asList (ערכים)); }

3.1. הִצטַלְבוּת

ראשית, אנו נשתמש ב- לשמור על הכל שיטה ל ליצור את הצומת של ערכות הדוגמה שלנו. כי לשמור על הכל משנה את הסט ישירות, נכין עותק של setA שקוראים לו intersectSet. ואז נשתמש ב- לשמור על הכל שיטה לשמור את הערכים הנמצאים גם הם setB:

הגדר intersectSet = חדש HashSet (setA); intersectSet.retainAll (setB); assertEquals (setOf (2,4), intersectSet);

3.2. הִתאַחֲדוּת

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

הגדר unionSet = חדש HashSet (setA); unionSet.addAll (setB); assertEquals (setOf (1,2,3,4,6,8), unionSet);

3.3. השלמה יחסית

לבסוף נשתמש ב- להסיר את כל שיטה ל ליצור את ההשלמה היחסית של setB ב setA. אנו יודעים שאנו רוצים את הערכים הנמצאים setA שלא קיימים ב setB. אז אנחנו רק צריכים להסיר את כל האלמנטים מ- setA שנמצאים גם ב setB:

הגדר differenceSet = חדש HashSet (setA); differenceSet.removeAll (setB); assertEquals (setOf (1,3), differenceSet);

4. יישום פעולות קבוצות עם זרםס

4.1. הִצטַלְבוּת

בואו ניצור את צומת הסטים שלנו באמצעות זרמים.

ראשית, נקבל את הערכים מ setA לתוך זרם. ואז נסנן את הזרם כדי לשמור על כל הערכים שנמצאים גם הם setB. ולבסוף, נאסוף את התוצאות לחדש מַעֲרֶכֶת:

הגדר intersectSet = setA.stream () .filter (setB :: מכיל) .collect (Collectors.toSet ()); assertEquals (setOf (2,4), intersectSet);

4.2. הִתאַחֲדוּת

עכשיו בואו נשתמש בשיטה הסטטית Streams.concat להוסיף את ערכי הסטים שלנו ליחיד זרם.

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

הגדר unionSet = Stream.concat (setA.stream (), setB.stream ()) .collect (Collectors.toSet ()); assertEquals (setOf (1,2,3,4,6,8), unionSet);

4.3. השלמה יחסית

לבסוף, ניצור את ההשלמה היחסית של setB ב setA.

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

הגדר differenceSet = setA.stream () .filter (val ->! SetB.contains (val)) .collect (Collectors.toSet ()); assertEquals (setOf (1,3), differenceSet);

5. ספריות שירות לפעולות קבוצות

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

5.1. תלות

על מנת להשתמש בגויאבה סטים ואוספי Apache Commons SetUtils עלינו להוסיף את התלות שלהם:

 com.google.guava guava 27.1-jre org.apache.commons commons-collection4 4.3 

5.2. ערכות גויאבה

בואו נשתמש בגויאבה סטים בכיתה לביצוע הִצטַלְבוּת ו הִתאַחֲדוּת על ערכות הדוגמה שלנו. על מנת לעשות זאת אנו יכולים פשוט להשתמש בשיטות הסטטיות הִתאַחֲדוּת ו הִצטַלְבוּת של ה סטים מעמד:

הגדר intersectSet = Sets.intersection (setA, setB); assertEquals (setOf (2,4), intersectSet); הגדר unionSet = Sets.union (setA, setB); assertEquals (setOf (1,2,3,4,6,8), unionSet);

עיין במאמר ערכות הגויאבה שלנו כדי ללמוד עוד.

5.3. אוספי Apache Commons

עכשיו בואו נשתמש ב- הִצטַלְבוּת ו הִתאַחֲדוּת שיטות סטטיות של SetUtils מחלקה מאוספי Apache Commons:

הגדר intersectSet = SetUtils.intersection (setA, setB); assertEquals (setOf (2,4), intersectSet); הגדר unionSet = SetUtils.union (setA, setB); assertEquals (setOf (1,2,3,4,6,8), unionSet);

התבונן באוספי Apache Commons שלנו SetUtils הדרכה למידע נוסף.

6. מסקנה

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

ניתן למצוא את כל דוגמאות הקוד ב- GitHub.


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