JavaRush /Java blogi /Random-UZ /Java to'plami | Java to'plamlari

Java to'plami | Java to'plamlari

Guruhda nashr etilgan
Salom! So'nggi bir necha darslar davomida biz ArrayList-ni o'zlashtirishda katta yutuqlarga erishdik. Biroq, bu vaqt ichida biz faqat eng oddiy operatsiyalarni bajardik: o'chirish, kiritish, konsolga chiqarish. Albatta, bu ArrayList dan foydalanishda ishlab chiquvchilar duch keladigan muammolar ro'yxatining oxiri emas . Massivlar va massivlar sinfi haqidagi ma'ruzani eslaysizmi ? U Java yaratuvchilari tomonidan dasturchilar massivlar bilan ishlashda duch keladigan umumiy muammolarni hal qilish uchun maxsus ishlab chiqilgan. ArrayList haqida nima deyish mumkin ? Albatta, u uchun ham odatiy vazifalar ro'yxati mavjud. Ularning barchasi alohida sinfda amalga oshirilganmi yoki har safar kerakli xatti-harakatni qo'lda yozishimiz kerakmi? Albatta, hamma narsani o'zingiz yozishingiz shart emas. Java-da to'plamlardan foydalanishda bajariladigan eng keng tarqalgan operatsiyalar Collections maxsus statik sinfida allaqachon amalga oshirilgan. Sinflar to'plami - 1

Java ichida to'plamlar

"To'plamlar" Java-da bir nechta ma'lumotlar tuzilmalarining umumiy nomi. Ma'lumotlar turli yo'llar bilan saqlanishi mumkin. Hozircha biz faqat ma'lumotlar massivda saqlanadigan ArrayList sinfini o'rgandik. Qolgan to'plamlar bilan keyinroq tanishamiz. Endi Collections sinfi nafaqat ArrayList bilan, balki Java-dagi boshqa turdagi to'plamlar bilan ham ishlashga mo'ljallanganligini tushunish kifoya (aslida uning nomi). Xo'sh, ArrayList bilan ishlashda Collections sinfi qanday vazifalarni hal qilishga imkon beradi? Birinchi va eng aniq - tartiblash. Massivlar haqidagi ma'ruzada biz raqamlar bilan misolni ko'rib chiqdik, endi esa qatorlar bilan misolni ko'rib chiqamiz. To'plamlar mazmunini saralash uchun Collections klassi quyidagi usulni qo'llaydi 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);

   }
}
Xulosa:

[Венера, Земля, Марс, Меркурий, Нептун, Сатурн, Уран, Юпитер]
Chiziqlar alifbo tartibida tartiblangan! Nima uchun alifbo tartibida? Sinf Stringsatrlarni bir-biri bilan qanday solishtirishni aniq aniqlash uchun dasturlashtirilgan (aniq alifbo tartibida). O'zingiz yaratadigan sinflar uchun siz o'zingizning taqqoslash mexanizmingizni amalga oshirishingiz mumkin, ammo biz bu haqda boshqa ma'ruzalarda gaplashamiz. Bundan tashqari, Collections klassi a dagi minimal va maksimal elementni topishga imkon beradi ArrayList. Bu min()va usullari yordamida amalga oshiriladi 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));

}
Xulosa:

7
1
Bu, albatta, barcha elementlardan o'tish va eng katta/eng kichik elementni qidirish uchun qo'lda kod yozishdan ko'ra ancha qulayroqdir :) Yana bir juda foydali usul reverse(). Agar elementlar teskari tartibda bo'lishi uchun ro'yxatni "teskari" qilishimiz kerak bo'lsa, buni qanday qilamiz? Ehtimol, bunday algoritmni o'zingiz yozish juda oson bo'lmaydi :) Yaxshiyamki, usul reverse()buni qanday qilishni allaqachon biladi. Misol uchun, bizga bu usul bizning sayyoralarimizni alifbo tartibida qanday tartiblashini yoqtirmaydi sort()va biz tartibni teskarisiga - Z dan A ga o'zgartirmoqchimiz:
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);

   }
}
Xulosa:

[Юпитер, Уран, Сатурн, Нептун, Меркурий, Марс, Земля, Венера]
Aytgancha, bu erda biz ko'pincha tartiblash, elementlarning tartibi va boshqalar haqida gapiramiz. Bizning vazifamiz aksincha bo'lsa-chi? Masalan, biz lotereya mexanizmini amalga oshirishga harakat qilyapmiz. Biz g'altakga 100 ta raqam qo'shdik, ular bir vaqtning o'zida ekranda paydo bo'lishi kerak. Birinchi bo'lib chiptadagi barcha raqamlarni kesib tashlagan ishtirokchi g'alaba qozonadi. Usul yordamida bunday mexanizmni amalga oshirish juda oson 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));
       }

   }
}
Xulosa:

Внимание! Из барабана появляются первые 10 чисел!
32
61
4
81
25
8
66
35
42
71
Bu juda oddiy! Muammo hal bo'ldi va bizning o'yinimiz yozildi :) Endi boshqa vaziyatni tasavvur qilaylik. solarSystemIlgari biz unda sanab o'tilgan sayyoralar bilan ro'yxat tuzdik . Va bu barchamizga mos keladiganga o'xshaydi, agar bitta narsa bo'lmasa: siz undan elementlarni olib tashlashingiz va yangilarini qo'shishingiz mumkin! Bu biz kutgan xatti-harakatlar emasligi aniq: bizning dasturimizdagi quyosh tizimi o'zgarmagan holatda bo'lishi kerak. Collections sinfida juda qiziqarli usul mavjud - unmodifiableList(). U berilgan roʻyxatning oʻzgarmas versiyasini yaratadi. Unga element qo'shish yoki olib tashlash mumkin bo'lmaydi. Quyosh tizimining sayyoralari ro'yxatiga kelsak, bu bizga kerak bo'lgan narsadir!
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)
Xato: solarSystemEndi siz hech narsa qo'sha olmaysiz! Bu holatda e'tibor berishingiz kerak bo'lgan yagona narsa - o'zgaruvchining turi bo'lishi kerak List<>emas, balki ArrayList<>(bu usul barcha turdagi ro'yxatlar uchun umumiy bo'lgan aynan shu turdagi ob'ektni qaytaradi). Ish paytida yuzaga kelishi mumkin bo'lgan yana bir keng tarqalgan holat - dasturchi elementlarni noto'g'ri tartibda qo'shgan. Agar bu sodir bo'lgan bo'lsa va Merkuriy va Neptun kutilmaganda joylarni o'zgartirsa, quyidagi usul bu xatoni tuzatishga yordam beradi 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);

   }
}
Biz ro'yxatimizni usulga swap(), shuningdek almashtirilishi kerak bo'lgan ikkita elementning indekslariga o'tdik. E'tibor bering: usul havolalar bilan emas, balki indekslar bilan ishlaydi. Shuning uchun, bu erda bizga bir usul kerak edi ArrayList.indexOf(). Xulosa:

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

[Меркурий, Венера, Земля, Марс, Юпитер, Сатурн, Уран, Нептун]
Va nihoyat, juda qiziqarli usul bilan tanishamiz - disjoint(). U ikkita kollektsiyaning kesishuvlari, ya'ni kamida bitta o'xshash element mavjudligini tekshiradi. Agar yo'q bo'lsa, qaytaradi true, agar shunday bo'lsa, qaytaradi 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));

   }
}
Ko'rib turganingizdek, bizning ikkita ro'yxatimizdagi elementlar butunlay boshqacha, shuning uchun dastur chiqadi true. Bu juda qiziqarli va juda foydali dars. Masalan Arrays, u biz uchun juda ko'p oddiy, arzimas ishlarni qiladi va boshqa narsalarga e'tibor qaratishimizga imkon beradi. Bu haqda Oracle hujjatlarida o'qing , u erda boshqa usullar mavjud.
Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION