Varım o halde yazıyorum…

Java Collections.sort() – Collator

Ağustos 29th 2010 Java

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.

Facebooktwittergoogle_pluslinkedinmailFacebooktwittergoogle_pluslinkedinmail
5 Yorum
“Java Collections.sort() – Collator”
Avatar
ahmet alp balkan

Gercekten cok faydali oldu bu yazi su an. Tesekkurler.


Avatar
yağız

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


Avatar
malik

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)


Avatar
Ahmet Burak Demirkoparan

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


Avatar
baris

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.




gerekli



gerekli - yayımlanmayacak


Yorum Yap & Fikrini Paylaş

Java Collections API sınıflarını kullanırken bolca for döngüleri kurar veya bu tip veriler üzerinden istediğimiz işlemleri gerçekleştirmek için çeşitli kod blokları yazarız. Lambdaj kütüphanesi bu tip kod blokları ile yaptığımız işlemleri çoğu kere tek satırlık kodlarla halletmemizi sağlayan bir arayüz sunuyor bize. Böylece listelere bir veri kaynağıymışcasına hemen her türlü seçim, sıralama, gruplama, dönüştürme, indeksleme […]

Önceki Yazılar

[caption id="attachment_616" align="aligncenter" width="208"][/caption]

Sonunda gösterimden kalkmadan izleyebildim.

Nasıl olabilip de izleyen hemen herkesin bir filmi bu kadar beğenebilmesine çok şaşırmıştım gösterime yeni girdiği zamanlar. Yersizmiş. Ki böyle herkesin beğenip de henüz izlememiş olanlar için beklentinin yükseldiği, ama o yükselen beklentilerin de ötesinde bir film bulduğum ilk filmdir. “Efsane” olarak tanımlanan filmlere yeni bir tane daha […]

Sonraki Yazılar

Sharing
Facebooktwittergoogle_pluslinkedinmailFacebooktwittergoogle_pluslinkedinmail