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 indexOf və lastIndexOf 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). Set və Map 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. Set və Map üçü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ı Set və Map 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.
GO TO FULL VERSION