JavaRush /בלוג Java /Random-HE /אוספים בג'אווה | אוספי Java

אוספים בג'אווה | אוספי Java

פורסם בקבוצה
שלום! במהלך השיעורים האחרונים, התקדמנו מאוד בשליטה ב- ArrayList. עם זאת, במהלך הזמן הזה ביצענו רק את הפעולות הפשוטות ביותר: מחיקה, הכנסה, פלט לקונסולה. כמובן, זה לא סוף רשימת הבעיות שעומדות בפני מפתחים בעת שימוש ב-ArrayList . זוכרים את ההרצאה על מערכים ושיעור מערכים ? הוא פותח על ידי יוצרי Java במיוחד כדי לפתור בעיות נפוצות שמתכנתים נתקלים בהן בעת ​​עבודה עם מערכים. מה לגבי ArrayList ? בטח יש איזו רשימה של משימות טיפוסיות גם עבורו. האם כולם יושמו בכיתה נפרדת כלשהי, או שנצטרך לכתוב את ההתנהגות הרצויה ידנית בכל פעם? כמובן, אתה לא צריך לכתוב הכל בעצמך. הפעולות הנפוצות ביותר המבוצעות בעת שימוש באוספים ב-Java כבר יושמו במחלקה סטטית מיוחדת 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> lottery = new ArrayList<>(100);
       for (int i = 1; i <= 100; i++) {

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

       Collections.shuffle(lottery);//mix
       System.out.println("Attention! The first 10 numbers appear from the drum!");
       for (int i = 0; i < 10; i++) {

           System.out.println(lottery.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
   }
}

Exception in thread "main" java.lang.UnsupportedOperationException
	at java.util.Collections$UnmodifiableCollection.add(Collections.java:1075)
	at 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));// wrong planet order
       System.out.println(solarSystem);

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

   }
}
העברנו את הרשימה שלנו לשיטה swap(), כמו גם את המדדים של שני האלמנטים שצריך להחליף. שימו לב: השיטה עובדת במיוחד עם אינדקסים, ולא עם קישורים. לכן, כאן היינו צריכים שיטה ArrayList.indexOf(). סיכום:

[Нептун, Венера, Земля, Марс, Юпитер, Сатурн, Уран, Меркурий]

[Меркурий, Венера, Земля, Марс, Юпитер, Сатурн, Уран, Нептун]
לבסוף, בואו נכיר שיטה מאוד מעניינת - disjoint(). הוא בודק אם לשני אוספים יש צמתים, כלומר לפחות אלמנט אחד זהה. אם לא, מחזיר true, אם כן, מחזיר false.
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));

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