ana sayfa | makaleler | kodlar | hakkında | cv | referanslar | iletisim
 

ıcomparable ve ıcomparer arayüzleri

.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,

maxiasp.net
maxiasp.com
evren ayan
yusuf öztürk
windowsclient.net
thewpfblog.com
msakademik.net
bildirgec
burak selim şenyurt
yazgelistir.com
cocuk.com

ffwinmobile
secim2007
pixelMaxi
db2class
filmhatalari
Tarihci



bu site bahadır arslan tarafından tasarlanmış ve kodlanmıştır