JavaRush /Java Blogu /Random-AZ /Java kolleksiyaları | Java Kolleksiyaları

Java kolleksiyaları | Java Kolleksiyaları

Qrupda dərc edilmişdir
Salam! Son bir neçə dərs ərzində biz ArrayList-i mənimsəməkdə böyük irəliləyiş əldə etdik. Ancaq bu müddət ərzində biz yalnız ən sadə əməliyyatları yerinə yetirdik: silmək, daxil etmək, konsola çıxarmaq. Əlbəttə ki, bu, tərtibatçıların ArrayList istifadə edərkən qarşılaşdıqları problemlərin siyahısının sonu deyil . Massivlər və Massivlər sinfi haqqında mühazirəni xatırlayırsınız ? O, proqramçıların massivlərlə işləyərkən qarşılaşdıqları ümumi problemləri həll etmək üçün xüsusi olaraq Java yaradıcıları tərəfindən hazırlanmışdır. ArrayList haqqında nə demək olar ? Şübhəsiz ki, onun üçün də tipik tapşırıqların siyahısı var. Onların hamısı ayrı bir sinifdə həyata keçirildi, yoxsa hər dəfə istədiyimiz davranışı əl ilə yazmalıyıq? Təbii ki, hər şeyi özünüz yazmağa ehtiyac yoxdur. Java-da kolleksiyalardan istifadə edərkən həyata keçirilən ən çox görülən əməliyyatlar artıq Collections xüsusi statik sinifində həyata keçirilib. Sinif kolleksiyaları - 1

Java-da kolleksiyalar

“Kolleksiyalar” Java-da bir neçə məlumat strukturları üçün ümumi addır. Məlumatlar müxtəlif yollarla saxlanıla bilər. İndiyə qədər biz yalnız məlumatların massivdə saxlandığı ArrayList sinifini öyrənmişik . Qalan kolleksiyalarla daha sonra tanış olacağıq. İndi onu başa düşmək kifayətdir ki, Collections sinfi təkcə ArrayList ilə deyil, həm də Java-da digər kolleksiya növləri ilə işləmək üçün nəzərdə tutulub (buna görə də əslində onun adı). Beləliklə, Collections sinfi ArrayList ilə işləyərkən hansı vəzifələri həll etməyə imkan verir? Birinci və ən aydın olanı çeşidləmədir. Massivlər haqqında mühazirədə biz rəqəmlərlə nümunəyə baxdıq, indi isə sətirlərlə nümunəyə baxaq. Kolleksiyaların məzmununu çeşidləmək üçün Collections sinfi aşağıdakı metodu həyata keçirir 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);

   }
}
Nəticə:

[Венера, Земля, Марс, Меркурий, Нептун, Сатурн, Уран, Юпитер]
Sətirlər əlifba sırası ilə sıralanıb! Niyə əlifba sırası ilə? Sinif Stringsətirlərin bir-biri ilə necə müqayisə olunduğunu dəqiq müəyyən etmək üçün proqramlaşdırılmışdır (dəqiq əlifba sırası ilə). Özünüz yaradacağınız dərslər üçün siz öz müqayisə mexanizminizi tətbiq edə bilərsiniz, lakin bu barədə digər mühazirələrdə danışacağıq. Bundan əlavə, Collections sinfi ArrayList. min()Bu və üsullardan istifadə etməklə həyata keçirilir 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));

}
Nəticə:

7
1
Bu, əlbəttə ki, bütün elementləri keçmək və ən böyük/kiçik elementi axtarmaq üçün əl ilə kod yazmaqdan daha rahatdır :) Digər son dərəcə faydalı üsul reverse(). Elementlərin tərs qaydada olması üçün siyahını “əksinə çevirmək” lazım gəlsəydi, bunu necə edərdik? Yəqin ki, belə bir alqoritmi özünüz yazmaq o qədər də asan olmayacaqdı :) Xoşbəxtlikdən, metod reverse()bunu necə edəcəyini artıq bilir. Məsələn, metodun planetlərimizi əlifba sırası ilə necə çeşidlədiyini bəyənmirik sort()və sıranı tərsinə - Z-dən A-ya dəyişmək istəyirik:
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);

   }
}
Nəticə:

[Юпитер, Уран, Сатурн, Нептун, Меркурий, Марс, Земля, Венера]
Yeri gəlmişkən, burada tez-tez çeşidləmə, elementlərin sırası və s. Əgər vəzifəmiz tam əksidirsə? Məsələn, biz lotereya mexanizmini tətbiq etməyə çalışırıq. Ekranda bir-bir görünməli olan çarxa 100 nömrə əlavə etdik. Biletindəki bütün nömrələri ilk keçən iştirakçı qalib gəlir. Metoddan istifadə edərək belə bir mexanizmi həyata keçirmək çox asandır 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));
       }

   }
}
Nəticə:

Внимание! Из барабана появляются первые 10 чисел!
32
61
4
81
25
8
66
35
42
71
Bu qədər sadədir! Problem həll olundu və oyunumuzun parçası yazılıb :) İndi fərqli bir vəziyyət təsəvvür edək. solarSystemƏvvəllər siyahıda olan planetlərlə bir siyahı yaratmışdıq . Bir şey olmasa da, hamımıza uyğun gəlir: ondan elementləri silib yenilərini əlavə edə bilərsiniz! Bu, açıq şəkildə gözlədiyimiz davranış deyil: proqramımızdakı günəş sistemi dəyişməz vəziyyətdə olmalıdır. Collections sinfinin çox maraqlı metodu var - unmodifiableList(). Verilmiş siyahının dəyişməz versiyasını yaradır. Ona element əlavə etmək və ya silmək mümkün olmayacaq. Günəş sisteminin planetlərinin siyahısına gəldikdə, bu, bizə lazım olan şeydir!
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)
Xəta: solarSystemİndi heç nə əlavə edə bilməzsiniz! Bu halda diqqət etməli olduğunuz yeganə şey dəyişənin tipinin List<>, yox olmasıdır ArrayList<>(bu üsul bütün siyahı növləri üçün ümumi olan məhz bu tip obyekti qaytarır). İş zamanı baş verə biləcək başqa bir ümumi vəziyyət proqramçının elementləri səhv ardıcıllıqla əlavə etməsidir. Əgər bu baş veribsə və Merkuri və Neptun gözlənilmədən yerlərini dəyişibsə, aşağıdakı üsul bizə bu səhvi düzəltməyə kömək edəcək 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);

   }
}
Siyahımızı metoda swap(), eləcə də dəyişdirilməsi lazım olan iki elementin indekslərinə keçdik. Diqqət yetirin: metod bağlantılarla deyil, xüsusi olaraq indekslərlə işləyir. Buna görə burada bir üsula ehtiyacımız var ArrayList.indexOf(). Nəticə:

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

[Меркурий, Венера, Земля, Марс, Юпитер, Сатурн, Уран, Нептун]
Nəhayət, çox maraqlı bir üsulla tanış olaq - disjoint(). O, iki kolleksiyanın kəsişmə nöqtələrinin, yəni ən azı bir eyni elementin olub olmadığını yoxlayır. Əgər yoxsa, qaytarır true, əgər varsa, qaytarır 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));

   }
}
Gördüyünüz kimi, iki siyahımızda olan elementlər tamamilə fərqlidir, buna görə də proqram çıxış edir true. Bu çox maraqlı və çox faydalı bir dərsdir. Məsələn Arrays, o, bizim üçün çoxlu rutin, qara iş görür və diqqətimizi başqa şeylərə yönəltməyə imkan verir. Bu barədə Oracle sənədlərində oxuyun , orada başqa üsullar da var.
Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION