Anasayfa > Java > Java Collections.sort() – Collator

Java Collections.sort() – Collator

Pazar, 29 AÄŸu 2010 Yorum ekle Yorumlara git

Java’nın Collections sınıfının faydalı bir bir metotundan bahsedeyim. Listeleri istediÄŸimiz gibi sıralamamız saÄŸlayan sort() metodu.

Bu gibi sıralama işlemlerinde en çok yaşanan sıkıntılardan bir tanesi String türünde verileri kıyaslarken ortaya çıkan Türkçe karakter sorunu. Şırnak, Çanakkale, Ordu illerini sıraladığımızda Çanakkale, Ordu, Şırnak sırasını beklerken mesela, Ordu-Çanakkale-Şırnak şeklinde bir sıranın ortaya çıkması gibi. Bu gibi durumlarda yerel karakter duyarlılığıyla kıyas yapabilen ve parametre olarak bir Locale alabilen Collator sınıfı yardımcı olacaktır.

BahsettiÄŸimiz sort() metodunun iki versiyonu bulunuyor;

Collections.sort(List<T> list)

ArrayList, LinkedList, Vector gibi List interface’ini implement eden bir sınıfı parametre olarak alıyor. Metodu bu ÅŸekli ile kullanabilmemiz için listenin barındırdığı elemanların tipi olan sınıf, Comparable sınıfını implement etmek durumunda.

Sadece kitap adını tutan, Kitap adında basit bir sınıfımız olduÄŸunu düşünelim. Bu sınıf implement ettiÄŸi Comparable interface’ nin compareTo() metodunu implement etmek durumunda.

 
public class Kitap implements Comparable<Kitap> {

	private String ad;

	public String getAd() {
		return ad;
	}

	public void setAd(String ad) {
		this.ad = ad;
	}

	@Override
	public int compareTo(Kitap kitap) {
	Collator collator = Collator.getInstance(Locale.getDefault());
        //veya Collator trCollator = Collator.getInstance(new Locale("tr", "TR"));
	return collator.compare(this.getAd(), o.getAd());
	}
}

Artık kitaplarımızı şu şekilde sıralayabiliriz;

...
List<Kitap> kitapListesi = getKitaplar();
Collections.sort(kitapListesi);
...
Collections.sort(List<T> list, Comparator<T> comparator)

; metodun bu versiyonu biri List diğeri de Comparator interface lerini implement eden sınıfları parametre olarak alıyor. Kitaplarımızı sıralama işlemi için bu kez Comparator interface ini implement eden Comparator bir sınıf tanımlıyoruz. Yine kitap adına göre sıraladığımızı varsayarsak compareTo() metodu şu şekilde olacaktır;

public class KitapComparator implements Comparator<Kitap>{

@Override
public int compare(Kitap kitap1, Kitap kitap2) {
Collator collator = Collator.getInstance(Locale.getDefault());
//veya Collator trCollator = Collator.getInstance(new Locale("tr", "TR"));
return collator.compare(kitap1.getAd, kitap2.getAd());
}
}

gibi kitaplarımızı karşılaştıran bir sınıf tanımladıktan sonra

...
List>Kitap> kitapListesi = getKitaplar();
Collections.sort(kitapListesi, new KitapComparator());
...

gibi bir ifade ile de kitapListesi sıralanmış bir hal alıyor.

Benzer şekilde gereklilikler doğrultusunda comparator sınıflar tanımlayıp ihtiyaç halinde kullanılabilir.

FacebooktwitterlinkedinmailFacebooktwitterlinkedinmail
  1. Çarşamba, 30 Mar 2011 00:53 | #1

    Gercekten cok faydali oldu bu yazi su an. Tesekkurler.

  2. yağız
    Çarşamba, 19 Haz 2013 10:30 | #2

    teşekkürler, güzel anlatım.

  3. malik
    Pazartesi, 14 Eki 2013 01:38 | #3

    ben kitap örneğinden devam edecek olursak bir de kitabın numarsı olsun
    öyle olunca sort işlemi bir türlü olmuyor ,çok acil yardımınıza ihtiyacım var (bu arada iletişim bölümündeki captch çalışmıyor)

  4. Ahmet Burak Demirkoparan
    Salı, 21 Oca 2014 14:31 | #4

    Kardeş güzel makale teşekkür ederim

  5. baris
    Cuma, 13 Åžub 2015 02:15 | #5

    Collator class ının getInstance methodu factory method. Kitap class ınızın 1 statik collator u olsa daha mantıklı olur diye düşünüyorum. compareTo methoduna eklerseniz her compare işleminde bir collator yaratmış olacaksınız.

  1. Henüz geri bağlantı yok