CodeGym /Kurslar /JAVA 25 SELF /Java kolleksiyalarında elementlərin axtarışı və çeşidlənm...

Java kolleksiyalarında elementlərin axtarışı və çeşidlənməsi

JAVA 25 SELF
Səviyyə , Dərs
Mövcuddur

1. Kolleksiyalarda elementlərin axtarışı

Standart metodlarla axtarış

Məsələn, adlardan ibarət bir siyahımız olanda:

List<String> names = List.of("Anna", "Boris", "Viktoriya", "Anna", "Dmitri");

Java axtarış üçün bir neçə əlverişli metod təklif edir:

  • contains(Object o) — kolleksiyada elementin olub-olmadığını yoxlayır.
  • indexOf(Object o) — elementin ilk daxilolma indeksini qaytarır (tapılmadıqda -1).
  • lastIndexOf(Object o) — elementin son daxilolma indeksini qaytarır (və ya -1).

Nümunələr:

System.out.println(names.contains("Anna"));      // true
System.out.println(names.indexOf("Anna"));       // 0
System.out.println(names.lastIndexOf("Anna"));   // 3
System.out.println(names.contains("Sergey"));    // false

Fakt: Set tipli kolleksiyalar üçün indexOflastIndexOf metodları yoxdur — Set-də ümumiyyətlə indekslər olmur, yalnız unikal dəyərlər olur.

Şərtə görə axtarış

Bəzən konkret dəyəri yox, müəyyən şərtə cavab verən elementi tapmaq lazımdır. Məsələn, uzunluğu 6 simvoldan böyük olan ilk adı tapmaq. Adi for dövrü buna çox uyğundur: uyğun element tapılan kimi — break istifadə edin.

List<String> names = List.of("Anna", "Boris", "Viktoriya", "Anna", "Dmitri");

String found = null;
for (String name : names) {
    if (name.length() > 6) {
        found = name;
        break; // İlk uyğun elementi tapdıq, dövrdən çıxmaq olar
    }
}
System.out.println(found); // Viktoriya

Maksimal və minimal dəyərin axtarışı

Müqayisə oluna bilən elementlərdən ibarət kolleksiyalar üçün (məsələn, ədədlər) maksimum və minimumu Collections sinfi ilə tez tapmaq olar.

List<Integer> numbers = List.of(10, 5, 20, 7, 20, 3);

int max = Collections.max(numbers); // 20
int min = Collections.min(numbers); // 3

System.out.println("Maksimum: " + max);
System.out.println("Minimum: " + min);

Vacibdir: Elementlər müqayisə oluna bilməlidir (Comparable həyata keçirilməlidir), əks halda komparator vermək lazım olacaq.

2. Kolleksiyaların çeşidlənməsi

Siyahının standart qaydada çeşidlənməsi

Yalnız dəyişdirilə bilən siyahıları çeşidləmək olar (məsələn, ArrayList, LinkedList). SetMap tipli kolleksiyalar birbaşa çeşidləməni dəstəkləmir.

Susmaya görə çeşidləmə “təbii ardıcıllıq”la aparılır: ədədlər üçün — artan, sətirlər üçün — əlifba sırası.

List<Integer> numbers = new ArrayList<>(List.of(5, 1, 7, 3));
Collections.sort(numbers);
System.out.println(numbers); // [1, 3, 5, 7]

Eyni şeyi siyahının sort metodu ilə də etmək olar:

List<Integer> numbers = new ArrayList<>(List.of(5, 1, 7, 3));
numbers.sort(null); // null o deməkdir: təbii ardıcıllıqdan istifadə et
System.out.println(numbers); // [1, 3, 5, 7]

Komparatorla çeşidləmə

Öz qaydanız lazımdırsa — məsələn, sətirləri uzunluğa görə çeşidləmək:

List<String> words = new ArrayList<>(List.of("pişik", "fil", "milçək", "kərgədan"));

words.sort(Comparator.comparingInt(String::length));
System.out.println(words); // [fil, pişik, milçək, kərgədan]

Tərs qaydada:

words.sort(Comparator.comparingInt(String::length).reversed());
System.out.println(words); // [kərgədan, milçək, pişik, fil]

Collections.sort vasitəsilə köhnə üslub:

Collections.sort(words, Comparator.comparingInt(String::length));

3. Müxtəlif kolleksiyaların çeşidlənmə xüsusiyyətləri

Çeşidləmə yalnız siyahını dəyişir

Çeşidləmə metodları (sort, Collections.sort) yalnız elementlərin sırasını dəstəkləyən kolleksiyalarla (məsələn, List) işləyir. SetMap üçün belə metodlar nəzərdə tutulmayıb.

Set-i çeşidləmək cəhdi:

Set<Integer> mySet = new HashSet<>(List.of(3, 1, 2));
Collections.sort(mySet); // Kompilyasiya xətası: sort List gözləyir!

Set-dən çeşidlənmiş siyahı əldə etmək lazımdırsa:

List<Integer> sortedFromSet = new ArrayList<>(mySet);
Collections.sort(sortedFromSet);
System.out.println(sortedFromSet); // [1, 2, 3]

Map-ın çeşidlənməsi: açarlara və dəyərlərə görə

Map-ı birbaşa çeşidləmək olmaz, amma belə etmək olar:

  • “açar–dəyər” cütlüklərinin siyahısını almaq
  • Onu lazım olan qaydada çeşidləmək
  • Ehtiyac olarsa yeni Map yığmaq

Nümunə: dəyərlərə görə çeşidləmə

Map<String, Integer> scores = Map.of(
    "Anna", 15,
    "Boris", 20,
    "Vika", 12
);

List<Map.Entry<String, Integer>> entries = new ArrayList<>(scores.entrySet());
entries.sort(Map.Entry.comparingByValue());

for (Map.Entry<String, Integer> entry : entries) {
    System.out.println(entry.getKey() + ": " + entry.getValue());
}
// Vika: 12
// Anna: 15
// Boris: 20

Obyektlərin sahəyə görə çeşidlənməsi

Tutaq ki, istifadəçi sinfimiz var:

class User {
    String name;
    int age;
    User(String name, int age) {
        this.name = name;
        this.age = age;
    }
    @Override
    public String toString() {
        return name + " (" + age + ")";
    }
}

Və istifadəçilərin siyahısı:

List<User> users = new ArrayList<>(List.of(
    new User("Anna", 22),
    new User("Boris", 18),
    new User("Vika", 25)
));

Yaşa görə çeşidləyirik:

users.sort(Comparator.comparingInt(u -> u.age));
System.out.println(users); // [Boris (18), Anna (22), Vika (25)]

Tərs qaydada:

users.sort(Comparator.comparingInt((User u) -> u.age).reversed());
System.out.println(users); // [Vika (25), Anna (22), Boris (18)]

4. Kolleksiyalarda axtarış və çeşidləmə zamanı tipik səhvlər

Xəta № 1: Dəyişdirilə bilməyən siyahının çeşidlənməsi. List.of(...) vasitəsilə yaradılmış siyahıları dəyişmək olmaz — sort çağıranda UnsupportedOperationException alacaqsınız.

List<Integer> immutable = List.of(3, 1, 2);
immutable.sort(null); // İstisna atacaq!

Xəta № 2: Set və ya Map-ı birbaşa çeşidləmək. Çeşidləmə metodları SetMap ilə işləmir. Çeşidləmək lazımdırsa, əvvəlcə məlumatları siyahıya çevirin.

Xəta № 3: Obyektləri səhv müqayisə etmək. Müqayisə zamanı tam ədədləri “birbaşa çıxmayın” — daşmalar mümkündür. u1.age - u2.age əvəzinə Integer.compare və ya Comparator.comparingInt istifadə edin.

// users.sort((u1, u2) -> u1.age - u2.age); // İşləyir, amma daşma baş verə bilər!

Xəta № 4: Mürəkkəb axtarış üçün contains-dan istifadə. contains metodu yalnız tam uyğunluğu ( equals üzrə) yoxlayır. Sətirin bir hissəsinə və ya obyekt sahəsinə görə axtarmaq lazımdırsa — şərtin yoxlanması ilə dövrdən istifadə edin və ya komparatorlardan/stream-lərdən yararlanın.

1
Tapşırıq
JAVA 25 SELF, səviyyə, dərs
Bağlanıb
Meşədə heyvanın görünmələrinin izlənməsi 🌲🐾
Meşədə heyvanın görünmələrinin izlənməsi 🌲🐾
1
Tapşırıq
JAVA 25 SELF, səviyyə, dərs
Bağlanıb
Oyun liqasındakı matç nəticələrinin təhlili 🎮📊
Oyun liqasındakı matç nəticələrinin təhlili 🎮📊
1
Sorğu/viktorina
, səviyyə, dərs
Əlçatan deyil
Komparatorlar və obyektlərin müqayisəsi
Komparatorlar və obyektlərin müqayisəsi
Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION