2 Ocak 2021

Java Collection / Comparable Interface

ile gökhan

Integer ögelerden oluşan bir collection’ı sort metoduyla sıralayabiliriz. Peki sıralamak istediğimiz ögeler nesnelerden oluşuyorsa bunu nasıl sağlayabiliriz? Burada Comparable interface ve Comparator interface bu probleme çözüm oluyor. Bunlardan ilki olan Comparable interface’ine göz atalım:

Comparable interface’i compareTo adında tek bir metottan oluşmaktadır. String, Integer, Double, Float gibi wrapper sınıflar incelendiğinde bu interface implement edilmiş durumdadır:

public interface Comparable<T> {  
    public int compareTo(T o);
}

Örnek olarak bir okuldaki ögrencileri isme göre sıralamak istiyoruz. Bunun için Ogrenci sınıfımıza Comparable interface’ini implement etmemiz gerekmekte. CompareTo metodunda bu Ogrenci nesnemizin isim özelliğine göre karşılaştırma yapmamız gerekiyor. Sonrasında koleksiyon sınıfının sort metoduyla bu nesneleri kolaylıkla sıralayabiliriz:

public class Ogrenci implements Comparable<Ogrenci> {
	private String isim;
	public Ogrenci(String isim) {
		this.isim= isim;
	}
	public String toString() {
		return isim;
	}
	@Override
	public int compareTo(Ogrenci o) {
		// TODO Auto-generated method stub
		return isim.compareTo(o.isim);
	}
	public static void main(String[] args) {
		var ogrenci = new ArrayList<Ogrenci>();
		ogrenci.add(new Ogrenci("Gökhan"));
		ogrenci.add(new  Ogrenci("Batuhan"));
		ogrenci.add(new Ogrenci("Doğuhan"));
		Collections.sort(ogrenci);
		System.out.println(ogrenci); //Batuhan, Doğuhan, Gökhan
	}
}

CompareTo() metoduna dair bilmemiz gereken 3 kural bulunmaktadır: ,

1)Nesne compareTo() argümanına eşitse metot 0 değerini döner.

2)Nesne compareTo() argümanından daha küçükse negatif bir değer döner.

3)Nesne compareTo() argümanından daha büyükse pozitif bir değer döner.

Yukarıdaki örnekte String veri türünde işlem yapmıştık. Aynı işlemi integer veri tipinde örneklendirelim:

public class Hayvan implements Comparable<Hayvan> {
private int id;
	@Override
	public int compareTo(Hayvan h) {
		return id - h.id;
	}
	public static void main(String[] args) {
		var h1  = new Hayvan();
		var h2  = new Hayvan();
		h1.id = 4;
		h2.id = 9;
		
		System.out.println(h1.compareTo(h2)); //-5
		System.out.println(h1.compareTo(h1)); //0
		System.out.println(h2.compareTo(h1)); //5
	}

}

Comparable sınıfı parametre almadan implement edilirse (generic bir tip kullanılmazsa), compareTo() metodunda casting işlemi uygulanmalıdır.

public class Okul implements Comparable {
	String isim;
	@Override
	public int compareTo(Object o) {
		Okul ok = (Okul)o; //generic olmadığı için casting yapıldı.
		return isim.compareTo(ok.isim);
	}
}