- Konu sahibi
- #1
Java’da bir listeyi sıralamak için en pratik yöntem, listenin türüne göre
Aşağıdaki örnekte
Programın çıktısı şöyledir:
Aynı işlem
Yeni kodlarda
Ters sıralama için
Çıktı
Metinleri alfabetik olarak ters sırada sıralamak için de aynı yöntem kullanılabilir:
Türkçe karakterlerin ve büyük-küçük harflerin sıralamadaki konumu, kullanılan karşılaştırma kurallarına bağlı olabilir. Uygulamanızda kullanıcıya görünen Türkçe alfabetik sıra gerekiyorsa yalnızca varsayılan
Aşağıdaki ayrım, hangi yöntemi kullanacağınızı belirler:
Bu yöntemlerin hepsi listeyi sıralama kararını açıkça ifade eder. Ancak tablo sıralamanın kalıcı olup olmadığını değil, kullanılan karşılaştırma kuralını gösterir; sıralama sonrasında listenin değişip değişmediğini ayrıca dikkate almalısınız.
Kendi sınıfınızdan nesneler içeren listelerde Java’nın hangi alana göre sıralama yapacağını
Çıktı notu küçükten büyüğe gösterir:
Notları büyükten küçüğe sıralamak için karşılaştırıcıyı tersine çevirin:
Birincil ve ikincil sıralama kuralı gerektiğinde
Burada ilk karşılaştırma nottur. İki öğrencinin notu eşitse ikinci karşılaştırma olan ad kullanılır. Bu, özellikle veritabanından veya API’dan gelen kayıtların tutarlı biçimde gösterilmesi gerektiğinde işe yarar.
Bu örnekte iki liste farklıdır.
Listeyi sıralarken şu ayrımları kontrol edin:
Sonuç olarak basit değerlerde
list.sort(null) veya list.sort(Comparator) kullanmaktır. Sayısal değerlerde küçükten büyüğe, metinlerde doğal sözlük sırasına göre sıralama yapılır. Sıralama genellikle mevcut listenin içeriğini değiştirir; orijinal listeyi korumak istiyorsanız önce kopyasını oluşturmalısınız.Basit değerlerden oluşan listeyi sıralama
Aşağıdaki örnekte
ArrayList içindeki sayılar küçükten büyüğe sıralanır:
Java:
import java.util.ArrayList;
import java.util.List;
public class ListeSirala {
public static void main(String[] args) {
List<Integer> sayilar = new ArrayList<>(List.of(42, 7, 19, 3));
sayilar.sort(null);
System.out.println(sayilar);
}
}
Programın çıktısı şöyledir:
Kod:
[3, 7, 19, 42]
sort(null), elemanların kendi doğal sıralamasını kullanır. Integer için bu sıralama küçükten büyüğe doğrudur. Bu işlem yeni bir liste döndürmez; sayilar değişkeninin gösterdiği listeyi doğrudan sıralar.Aynı işlem
Collections.sort() ile de yapılabilir:
Java:
import java.util.Collections;
import java.util.List;
List<Integer> sayilar = new java.util.ArrayList<>(List.of(42, 7, 19, 3));
Collections.sort(sayilar);
Yeni kodlarda
list.sort() yöntemi genellikle daha okunaklıdır. Collections.sort() ise eski Java kodlarında ve mevcut projelerde hâlâ görülebilir.Büyükten küçüğe sıralama
Ters sıralama için
Comparator.reverseOrder() kullanılır:
Java:
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
List<Integer> sayilar = new ArrayList<>(List.of(42, 7, 19, 3));
sayilar.sort(Comparator.reverseOrder());
System.out.println(sayilar);
Çıktı
[42, 19, 7, 3] olur. Bu yaklaşım, doğal olarak sıralanabilen türlerde kullanılabilir. Örneğin Integer, Double ve String için uygundur.Metinleri alfabetik olarak ters sırada sıralamak için de aynı yöntem kullanılabilir:
Java:
List<String> isimler = new ArrayList<>(List.of("Zeynep", "Ali", "Mehmet"));
isimler.sort(Comparator.reverseOrder());
Türkçe karakterlerin ve büyük-küçük harflerin sıralamadaki konumu, kullanılan karşılaştırma kurallarına bağlı olabilir. Uygulamanızda kullanıcıya görünen Türkçe alfabetik sıra gerekiyorsa yalnızca varsayılan
String karşılaştırmasına güvenmek yerine uygun bir Collator yapılandırmalısınız.Sıralama yöntemlerini seçme
Aşağıdaki ayrım, hangi yöntemi kullanacağınızı belirler:
| İhtiyaç | Kullanılacak ifade | Sonuç |
|---|---|---|
| Doğal sırada sıralama | list.sort(null) | Küçükten büyüğe veya doğal metin sırası |
| Ters sırada sıralama | list.sort(Comparator.reverseOrder()) | Büyükten küçüğe veya ters metin sırası |
| Özel kurala göre sıralama | list.sort(comparator) | Belirlediğiniz alan ya da koşula göre sıra |
| Orijinal listeyi koruma | new ArrayList<>(liste) | Kopya liste sıralanır |
Nesnelerden oluşan listeyi bir alana göre sıralama
Kendi sınıfınızdan nesneler içeren listelerde Java’nın hangi alana göre sıralama yapacağını
Comparator.comparing() ile belirtirsiniz. Örneğin öğrencileri notlarına göre küçükten büyüğe sıralamak için:
Java:
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
class Ogrenci {
private final String ad;
private final int not;
Ogrenci(String ad, int not) {
this.ad = ad;
this.not = not;
}
public String getAd() {
return ad;
}
public int getNot() {
return not;
}
@Override
public String toString() {
return ad + ": " + not;
}
}
public class OgrenciSirala {
public static void main(String[] args) {
List<Ogrenci> ogrenciler = new ArrayList<>(List.of(
new Ogrenci("Ayşe", 82),
new Ogrenci("Mehmet", 65),
new Ogrenci("Zeynep", 94)
));
ogrenciler.sort(Comparator.comparingInt(Ogrenci::getNot));
System.out.println(ogrenciler);
}
}
Çıktı notu küçükten büyüğe gösterir:
Kod:
[Mehmet: 65, Ayşe: 82, Zeynep: 94]
Notları büyükten küçüğe sıralamak için karşılaştırıcıyı tersine çevirin:
Java:
ogrenciler.sort(
Comparator.comparingInt(Ogrenci::getNot).reversed()
);
Birincil ve ikincil sıralama kuralı gerektiğinde
thenComparing() eklenebilir. Örneğin öğrencileri önce nota göre büyükten küçüğe, notları eşitse ada göre alfabetik sıralamak için:
Java:
ogrenciler.sort(
Comparator.comparingInt(Ogrenci::getNot)
.reversed()
.thenComparing(Ogrenci::getAd)
);
Burada ilk karşılaştırma nottur. İki öğrencinin notu eşitse ikinci karşılaştırma olan ad kullanılır. Bu, özellikle veritabanından veya API’dan gelen kayıtların tutarlı biçimde gösterilmesi gerektiğinde işe yarar.
Orijinal listeyi değiştirmeden sıralama
sort() mevcut listenin sırasını değiştirir. İlk sırayı korumanız gerekiyorsa kopya oluşturun:
Java:
List<Integer> orijinal = new ArrayList<>(List.of(42, 7, 19, 3));
List<Integer> sirali = new ArrayList<>(orijinal);
sirali.sort(null);
System.out.println(orijinal); // [42, 7, 19, 3]
System.out.println(sirali); // [3, 7, 19, 42]
Bu örnekte iki liste farklıdır.
orijinal listenin sırası korunur, sirali ise yalnızca kopya üzerinde yapılan işlem sonucunda değişir.Sıralama çalışmadığında kontrol edilmesi gerekenler
Listeyi sıralarken şu ayrımları kontrol edin:
- Liste
List.of()ile oluşturulduysa değiştirilemez olabilir. Bu durumda öncenew ArrayList<>(liste)ile değiştirilebilir bir kopya oluşturun. - Nesneler için doğrudan
sort(null)kullanıyorsanız sınıfın doğal sıralama kuralı tanımlı olmalıdır. Aksi durumda karşılaştırmayıComparator.comparing()ile açıkça verin. - Listede
nulldeğerler varsa normal karşılaştırıcı hata verebilir. Null değerlerin başta veya sonda olmasını istiyorsanızComparator.nullsFirst()ya daComparator.nullsLast()kullanın. - Sıralama sonrasında beklediğiniz sıra oluşmuyorsa karşılaştırıcının gerçekten doğru alanı, yönü ve ikincil sıralama kuralını kullandığını kontrol edin.
Java:
List<Integer> sabitListe = List.of(42, 7, 19, 3);
List<Integer> siraliListe = new ArrayList<>(sabitListe);
siraliListe.sort(null);
Sonuç olarak basit değerlerde
list.sort(null), ters sırada Comparator.reverseOrder(), nesnelerde ise alanı belirten bir Comparator kullanmalısınız. Sıralamanın mevcut listeyi değiştirmesini istemiyorsanız işlemden önce mutlaka kopya oluşturun.