Java'da String Karşılaştırma

Java'da string karşılaştırması yaparken yaşayabileceğiniz problemlerden biri kullandığınız yerele (Locale) göre sonuçların yanlış olma ihtimalidir. Mesele normal bir sıralayıcı kullandığınız zaman büyük ihtimalle Türkçe karakterleriniz sıralamanın sonunda yer alacaktır. 


Bu sorunu çözmek için (elbette Türkçe için değil sadece, İspanyolca'daki ñ harfi ile ilgili de problemler çıkabiliyor) Collator adı verilen bir sınıftan yararlanılıyor. Bu sınıf yardımıyla sıralamalar istenen bir yerele göre rahatça yapılabiliyor. Örnek bir sınıf kodunu aşağıda bulabilirsiniz ve deneyebilirsiniz. Konunun ayrıntılı açıklamasını aşağıda verdiğim kaynak bağlantısıyla inceleyebilirsiniz. Kaynak kodu çalıştırdığınız zaman normal sıralamada Türkçe karakterlerin sona gittiğini ama Collator kullanınca uygun Locale ile doğru yerlerde bulunduğunu görebilirsiniz.

import java.awt.EventQueue;
import java.text.Collator;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Locale;

import javax.swing.Box;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextArea;

public class StringKarsilastirma {
public static void main(final String args[]) {
final Runnable runner = new Runnable() {
public void run() {
// Siralamada kullanilacak kelimeler
final String words[] = { "İl", "üç", "üşüme", "şiir", "İki",
"Çeşme", "Gök", "Araba" };
// Dizimizi List haline getiriyoruz
final List list = Arrays.asList(words);
// Goruntuleme icin kullanacagimiz pencereyi yaratiyoruz
final JFrame frame = new JFrame("Sıralama");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
final Box box = Box.createVerticalBox();
frame.setContentPane(box);
// En ustte kelimeleri normal halleriyle gosterelim
JLabel label = new JLabel("Kelimeler:");
box.add(label);
JTextArea textArea = new JTextArea(list.toString());
box.add(textArea);
// Collections sınıfındaki standart siralama metodunu cagiralim
Collections.sort(list);
label = new JLabel("Sıralı:");
box.add(label);
textArea = new JTextArea(list.toString());
box.add(textArea);
// Turkce collator yaratalim
final Collator trCollator = Collator.getInstance(new Locale(
"tr"));
// Bu collatoru kullanarak siralama yapalim
Collections.sort(list, trCollator);
label = new JLabel("Türkçe:");
box.add(label);
textArea = new JTextArea(list.toString());
box.add(textArea);
frame.setSize(400, 200);
frame.setVisible(true);
}
};
EventQueue.invokeLater(runner);
}
}


Kaynak: Sorting Strings

1 yorum:

Can Kavaklıoğlu dedi ki...

Çok faydalı bir kaynak, teşekkürler : )