.net ortamında kod yazarken benzer
veya farklı türlerdeki verileri içinde toplayabileceğimiz üç farklı yapı vardır:
- diziler (array)
- kolleksiyonlar (collections)
- listeler (list)
tüm bu veri yapıları, verileri işleme aşamasında bazı ortak metodlar içerirler;
arama, temizleme, yeni veri ekleme, çıkartma ve sıralama gibi. bu ortak metodların
çoğu olduğu şekilde kullanılabilirken sıralama (sort) metodu kullanım sırasında
bazen sorun çıkartabileceği gibi bazen de kullanabilmek için bizim müdahelemizi
gerektirir.
eğer siz (örneğin) bir arraylist içerisinde doldurduğunuz 10 tane sayı içinde bir
sıralama yapmak isterseniz arraylist bu işlemi sorunsuz halledebilecektir. ancak
bu sıralama azalandan çoğalana doğru olacaktır; peki ya siz tam tersini isterseniz?
ya da siz arraylist içine önceden tanımlı bir veri türü yerine (int, float,vs..)
kendi tanımladığınız veriler koyduysanız (class, struct) o zaman sıralama işlemi
nasıl olacak?
bu soruların cevabı ıcomparable ve ıcomparer arayüzlerinde (interface) saklı. bu
yazımızın konu da bu arayüzleri kullanarak herhangi bir dizi, kolleksiyon ya da
liste içindeki verilerimizin istediğimiz şekilde sıralanmasını sağlamak.
ıcomparer arayüzü
ıcomparer arayüzü uygulandığı sınıfa int compare(object, object) isimli
bir metodu bildirme zorunluluğu getirir. bu metod da sizin belirlediğiniz şartlara
bağlı kalarak sıralama yapar.
öncelikle herhangi bir destekte bulunmadan arraylist'in içine veri ekleyip sıralama
yaptıralım. bu yazı içerisindeki tüm örnekleri bir konsole (console) projesi içinde
gerçekleştireceğim, dolayısı ile bir proje oluşturdum ve main metodu içine
aşağıdaki kodu yazıp ctrl + f5'e basarak çalıştırıyorum.
arraylist arrlist = new arraylist();
arrlist.add(10);
arrlist.add(1);
arrlist.add(24);
arrlist.add(7);
arrlist.add(28);
arrlist.add(16);
arrlist.add(0);
console.writeline("sıralanmamış veriler:\n");
foreach (int i in arrlist)
console.writeline(i);
arrlist.sort();
console.writeline("sıralanmış veriler:\n");
foreach (int i in arrlist)
console.writeline(i);

gördüğünüz gibi yukarıdaki kodlar ile verilerimiz azdan çoğa doğru dizildiler. peki
ya ben tersini isteseydim?
işte bu sorunun cevabı ıcomparer arayüzünün altında yatıyor; çünkü biz arraylist'e
müdahele edemeyiz (yani sıralama yapan sort metodunu değiştiremeyiz), dolayısı ile
bizim arraylist'e sıralama sırasında kullanması için bir sıralayıcı metod göndermemiz
lazım. şimdi biz de bunu yapacağız, öncelikle ıcomparer arayüzünün uygulandığı bir
sınıf tanımlayıp bunun bir örneğini arraylist'in sort metoduna parametre olarak
yollayacağız.
öncelikle siraliyici.cs isimli bir dosya oluşturuyorum ve bu dosyaya system.collections
namespace'ini using komutu ile ekliyoruz. ardından aşağıdaki şekilde
ıcomparer ifadesini ekleyip, arayüzü sınıfa uyguluyoruz.
ımplement ınteface (arayüzü uygula) komutunu çalıştırdıktan sonra sınıfımızın içine
compare isimli bir metod eklenecektir. bizimde zaten işimiz bu metod içerisinde.
biz arraylist'e sort metodunu çalıştır dediğimizde arraylist az önce oluşturduğumuz
compare metodunu çağıracaktır ve metoda iki parametre yollayacaktır. object
türündeki bu iki parametre arraylist'in iki elemanını temsil edecek, biz de öncelikle
o elemanları object türünden kendi türlerine (int) çevireceğiz sonra da birbirilerini
ile karşılaştıracağız. karşılaştırma işlemini her veri türünde bulunan compareto
isimli bir bir metodu çağırarak yapacağız. compareto metodu bir tane parametre
alır ve aşağıdaki kontrolü yapıp geriye -1, 0 veya 1 sonucunu döndürür.eğer compareto
metodunu çağıran veri, parametre olarak yollanan veri
- -den büyükse +1,
- -ye eşitse 0,
- -den küçükse -1 sonucunu döndürür. sıralama işlemi de bu dönen sonuna göre devam
eder.
aşağıdaki kodlar compare metodunun içinde olması gereken kodlardır.
int sayi1 = (int)x;
int sayi2 = (int)y;
return sayi2.compareto(sayi1);
yukarıdaki kodlarda öncelikle x ve y parametrelerinin object türünden,