CodeGym /בלוג Java /Random-HE /שיעור אוספים ב-Java
John Squirrels
רָמָה
San Francisco

שיעור אוספים ב-Java

פורסם בקבוצה
היי! בשיעורים האחרונים, התקדמנו מאוד בשליטה שלנו ב ArrayList. עם זאת, עד כה ביצענו רק את הפעולות הפשוטות ביותר: הסרה, הוספה והצגה. כמובן, זה לא מכסה את הרשימה המלאה של המשימות שעל המפתחים לבצע בעת עבודה עם ArrayList. זוכרים את השיעור על מערכים והכיתה Arrays? יוצרי Java תכננו במיוחד את המחלקה הזו כדי להתמודד עם המשימות הנפוצות ביותר שעומדות בפני מתכנתים בעת עבודה עם מערכים. ומה לגבי ArrayList? אין ספק, יש רשימה של משימות נפוצות שצריך לבצע איתו. האם כולם יושמו בכיתה מסוימת, או שעלינו לכתוב את היישום שלנו בכל פעם? כמובן, אתה לא צריך לכתוב הכל בעצמך. הפעולות הנפוצות ביותר הכוללות אוספים כבר יושמו במחלקה הסטטית המיוחדת Collections. שיעור אוספים - 1 ב-Java, קבוצה של מבני נתונים מכונה בדרך כלל אוסף . ניתן לאחסן נתונים בדרכים רבות ושונות. עד כה, למדנו רק את ArrayListהמחלקה, שבה הנתונים מאוחסנים במערך. נערוך היכרות עם אוספים נוספים בהמשך. לעת עתה, מספיק רק להבין שהכיתה Collectionsנועדה לעבוד לא רק עם ArrayList, אלא גם עם סוגים אחרים של אוספים (ומכאן השם שלה). אז, באילו משימות Collectionsהכיתה בעצם עוזרת בעבודה עם ArrayList? הראשון והברור ביותר הוא המיון. בשיעור על מערכים, שקלנו דוגמה עם מספרים. כעת נשקול דוגמה עם מחרוזות. הכיתה Collectionsמיישמת את sort()השיטה למיון תוכן האוספים:
public class Main {

   public static void main(java.lang.String[] args) {

       String mercury = new String("Mercury");
       String venus = new String("Venus");
       String earth = new String("Earth");
       String mars = new String("Mars");
       String jupiter = new String("Jupiter");
       String saturn = new String("Saturn");
       String uranus = new String("Uranus");
       String neptune = new String("Neptune");

       ArrayList<String> solarSystem = new ArrayList<>(Arrays.asList(mercury, venus, earth, mars,
               jupiter, saturn, uranus, neptune));
       Collections.sort(solarSystem);
       System.out.println(solarSystem);

   }
}
פלט: [כדור הארץ, צדק, מאדים, מרקורי, נפטון, שבתאי, אורנוס, נוגה] המיתרים ממוינים בסדר אלפביתי! אבל למה לפי אלפביתי? המחלקה Stringמיישמת למעשה את ההיגיון השולט באופן ההשוואה בין המחרוזות (שזה במקרה בסדר אלפביתי). עבור שיעורים שאתה יוצר בעצמך, אתה יכול ליישם את היגיון ההשוואה שלך, אבל נדבר על זה בשיעורים אחרים. הכיתה Collectionsגם עוזרת לך למצוא את האלמנט המינימלי והמקסימלי ב- ArrayList. זה נעשה באמצעות שיטות min()ו max():
public static void main(java.lang.String[] args) {

   ArrayList<Integer> numbers = new ArrayList<>(Arrays.asList(1,2,3,4,5,6,7));
   System.out.println(Collections.max(numbers));
   System.out.println(Collections.min(numbers));

}
פלט: 7 1 באופן טבעי, זה הרבה יותר נוח מלכתוב ידנית את הקוד כדי לחזור על כל האלמנטים ולמצוא את האלמנט הגדול/קטן ביותר :) שיטה מאוד שימושית נוספת היא reverse(). אם היינו צריכים "להעיף" את הרשימה כך שהאלמנטים ילכו בסדר הפוך, איך היינו עושים זאת? זה כנראה לא יהיה כל כך קל לכתוב אלגוריתם כזה לבד :) למרבה המזל, השיטה reverse()כבר יודעת איך. נניח שאנחנו לא אוהבים את העובדה שהשיטה sort()מיינה את כוכבי הלכת שלנו לפי אלפביתי, ואנחנו רוצים להפוך את הסדר שלהם: מ-Z ל-A:
public class Main {

   public static void main(java.lang.String[] args) {

       String mercury = new String("Mercury");
       String venus = new String("Venus");
       String earth = new String("Earth");
       String mars = new String("Mars");
       String jupiter = new String("Jupiter");
       String saturn = new String("Saturn");
       String uranus = new String("Uranus");
       String neptune = new String("Neptune");

       ArrayList<String> solarSystem = new ArrayList<>(Arrays.asList(mercury, venus, earth, mars,
               jupiter, saturn, uranus, neptune));
       Collections.sort(solarSystem);
       Collections.reverse(solarSystem);
       System.out.println(solarSystem);

   }
}
פלט: [ונוס, אורנוס, שבתאי, נפטון, מרקורי, מאדים, צדק, כדור הארץ] דיברנו הרבה על מיון, סדר היסודות וכו'. אבל מה אם הייתה לנו מטרה הפוכה? לדוגמה, נניח שאנו מנסים ליישם משחק בינגו. אנו מוסיפים 100 מספרים לתוף. הם צריכים להופיע על המסך אחד בכל פעם. השחקן הראשון שימחק את כל המספרים בכרטיסו זוכה. זה קל ליישום באמצעות shuffle()השיטה:
public class Main {

   public static void main(java.lang.String[] args) {

       ArrayList<Integer> bingoDrum = new ArrayList<>(100);
       for (int i = 1; i <= 100; i++) {

           bingoDrum.add(i);// add the numbers 1 to 100 to the drum
       }

       Collections.shuffle(bingoDrum);// Mix it up
       System.out.println ("Your attention, please! Here are the first 10 numbers from the drum!");
       for (int i = 0; i < 10; i++) {

           System.out.println(bingoDrum.get(i));
       }

   }
}
פלט: תשומת הלב שלך, בבקשה! הנה 10 המספרים הראשונים מהתוף! 32 61 4 81 25 8 66 35 42 71 זה כל כך קל! הבעיה נפתרה, והחלק שלנו במשחק כתוב :) עכשיו בואו נדמיין סיטואציה אחרת. בעבר יצרנו solarSystemרשימה שהכילה את כוכבי הלכת. ונראה שהוא מתאים לנו מכל בחינה מלבד אחת: אתה יכול למחוק ממנו פריטים ולהוסיף חדשים ! ברור שזו לא ההתנהגות שאנו מצפים לה: מערכת השמש צריכה להיות בלתי ניתנת לשינוי בתוכנית שלנו. לכיתה Collectionsיש שיטה מאוד מעניינת: unmodifiableList(). זה יוצר רשימה בלתי ניתנת לשינוי מהרשימה שהועברה כארגומנט. אינך יכול להוסיף או למחוק פריטים מרשימה זו. כשעוסקים ברשימת כוכבי הלכת במערכת השמש, זה בדיוק מה שאנחנו רוצים!
public class Main {

   public static void main(java.lang.String[] args) {

       String mercury = new String("Mercury");
       String venus = new String("Venus");
       String earth = new String("Earth");
       String mars = new String("Mars");
       String jupiter = new String("Jupiter");
       String saturn = new String("Saturn");
       String uranus = new String("Uranus");
       String neptune = new String("Neptune");

       List<String> solarSystem = Collections.unmodifiableList(new ArrayList<>(Arrays.asList(mercury, venus, earth, mars,
               jupiter, saturn, uranus, neptune)));
       solarSystem.add("Pluto");// Try to add a new element
   }
}
פלט: חריגה בשרשור "main" java.lang.UnsupportedOperationException ב-java.util.Collections$UnmodifiableCollection.add(Collections.java:1075) ב-Main.main(Main.java:21) זו שגיאה: אתה לא יכול להוסיף משהו solarSystem! הדבר היחיד שאתה צריך לשים לב כאן הוא העובדה שהשיטה הזו מחזירה List<>(לא ArrayList<>), שכן סוג זה נפוץ לכל מיני רשימות. עוד מצב די נפוץ שיכול לקרות בקלות הוא שהמתכנת יוסיף אלמנטים בסדר הלא נכון. אם זה קורה ונגלה שמרקורי ונפטון מעורבבים זה בזה, נוכל לתקן את הטעות הזו באמצעות swap()השיטה:
public class Main {

   public static void main(java.lang.String[] args) {

       String mercury = new String("Mercury");
       String venus = new String("Venus");
       String earth = new String("Earth");
       String mars = new String("Mars");
       String jupiter = new String("Jupiter");
       String saturn = new String("Saturn");
       String uranus = new String("Uranus");
       String neptune = new String("Neptune");

       ArrayList<String> solarSystem = new ArrayList<>(Arrays.asList(neptune, venus, earth, mars
       , jupiter, saturn, uranus, mercury));// The planets are in the wrong order
       System.out.println(solarSystem);

       Collections.swap(solarSystem, solarSystem.indexOf(mercury), solarSystem.indexOf(neptune));
       System.out.println(solarSystem);

   }
}
אנו מעבירים לשיטה swap()את הרשימה שלנו ואת המדדים של שני האלמנטים שצריך להחליף. שימו לב שהשיטה עובדת עם מדדים, לא עם הפניות. אז, כאן היינו צריכים להשתמש בשיטה ArrayList.indexOf(). פלט: [נפטון, נוגה, כדור הארץ, מאדים, צדק, שבתאי, אורנוס, מרקורי] [מרקורי, נוגה, כדור הארץ, מאדים, יופיטר, שבתאי, אורנוס, נפטון] לבסוף, נכיר שיטה מעניינת מאוד : disjoint(). הוא בודק אם שני אוספים מצטלבים, כלומר, האם יש להם לפחות אלמנט זהה אחד . אם הם לא עושים זאת, זה מחזיר נכון. אם הם עושים זאת, אז זה מחזיר שקר
public class Main {

   public static void main(java.lang.String[] args) {

       String mercury = new String("Mercury");
       String venus = new String("Venus");
       String earth = new String("Earth");
       String mars = new String("Mars");
       String jupiter = new String("Jupiter");
       String saturn = new String("Saturn");
       String uranus = new String("Uranus");
       String neptune = new String("Neptune");

       ArrayList<String> solarSystemPart1 = new ArrayList<>(Arrays.asList(mercury, venus, earth, mars));
       ArrayList<String> solarSystemPart2 = new ArrayList<>(Arrays.asList(jupiter, saturn, uranus, neptune));

       System.out.println(Collections.disjoint(solarSystemPart1, solarSystemPart2));

   }
}
כפי שאתה יכול לראות, לשתי הרשימות שלנו יש אלמנטים שונים לחלוטין, כך שהתוכנית מפיקה אמת . זהו שיעור מעניין ושימושי מאוד. כאילו Arrays, זה עושה לנו הרבה עבודה שגרתית, מייגעת, נותן לנו להתמקד בדברים אחרים.
הערות
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION