Java’da Comparator ve Comparable Arayüzleri (Interface)

Metin Alnıaçık
2 min readAug 20, 2023

--

Bir listede sıralama işlemi yaparken eğer listenin elemanları sayılardan oluşuyorsa sıralama sonrası ortaya çıkacak listeyi tahmin etmek zor değildir.

8. satırda, konsol çıktısı bizim listeye eklediğimiz sıralama gibidir.
[15, 11, 19, 12, 10]
12. satırda, sıralama işlemi sonrasında konsol çıktısı aşağıdaki gibidir.
[10, 11, 12, 15, 19]

Bunun yanı sıra sorted metoduna Comparator.reverseOrder() parametresini verirsek liste büyükten küçüğe sıralanacaktır.
[19, 15, 12, 11, 10]

Bu durum String listesi olduğunda birazcık farklılık göstermektedir. Sıralama karakterlerin ASCII kod tablosundaki değerlerine göre yapılmaktadır.

12. satırda, sıralama sonrasında konsol çıktısı aşağıdaki gibidir.

[Ahmet, Barış, Fikri]

Listenin son durumuna bakıldığında alfabetik olarak sıralıyor. Bu örneğe bakıldığında karakterin ASCII kodları ile ne alakası var diye düşünebilirsiniz. Bunun nedeni örnek için seçmiş olduğumuz kelimelerle alakalıdır. Örnek, aşağıdaki gibi değiştirildiğinde daha iyi anlaşılacaktır.

Yukarıdaki örneğin konsol çıktısı aşağıdaki gibidir.

[Ahmet, Barış, Fikri, ahmet, fikri]

Burada Ahmet ve ahmet isimlerinin sıralı gelmemesinin nedeni ASCII kod tablosunda küçük a harfinin büyük B ve büyük F harfinden sonra gelmesinden kaynaklanmaktadır.

String ve ilkel (primitive) tiplerde sıralamanın nasıl olduğunu gördük.

Kullanıcı tanımlı (user-defined) sınıflarda sıralama nasıl gerçekleştiğini görelim.

Örnek olarak, Employee adında bir sınıf yaratalım.

Listeye bazı kayıtlar atarak sıralama işlemini yapalım.

Sıralama yapmaya çalıştığımız satırda hata alırız. Konsoldaki hata aşağıdaki gibidir.

Konsoldaki hata; Java, string veya ilkel tiplerin listelerini nasıl sıralayacağını biliyor. Fakat kullanıcı tanımlı olan bir sınıfın nasıl sıralanacağını bilmemektedir. Bunun tanımlanması gerekiyor. Employee sınıfı Comparable arayüzünden implements yapılmalı ve gerekli olan compareTo metodu tanımlanmalıdır.

Employee sınıfını aşağıdaki gibi güncelliyoruz.

ilk satıra implements Comparable<Employee> kısmı eklendi.
69. satıra compareTo metodu eklendi. Metoda göre no alanına göre sıralama işlemi yapılacak.

Tekrar çalıştırdığımızda konsol çıktısı aşağıdaki gibidir.

Konsol çıktısı incelendiğinde sıralamanın no alanına göre yapıldığı görülmektedir.

Eğer Employee sınıfına no alanına göre sıralama özelliğini kaldırmadan cardNo alanına göre sıralama eklemek istersek aşağıdaki gibi bir sınıf ekleriz.

cardNo alanına göre sıralama yapmak için sıralama metodu şu şekilde çağırılmalıdır.

sorted metodu çağırılırken new EmployeeSortedByCardNo() parametresi kullanılır.

Konsol çıktısı aşağıdaki gibidir.

Konsol çıktısı incelendiğinde sıralamanın cardNo alanına göre yapıldığı görülmektedir.

Örneğin tamamına github adresimden ulaşabilirsiniz.

İyi günler,
Bol kodlamalar :)

--

--