Java :: Objelerin Sıralanması

Java’da List, ArrayList, Set vb Collections framework yapıları ve bunların metodları (add, remove, sort vb) sağladığı kolaylıklar sebebiyle bolca kullanır. Örneğin bir ArrayList içinde String ya da Integer tipinde nesneler varsa ve bunları sıralamamız gerekiyorsa Collections.sort(liste_ismi); şeklinde bir kullanımla listeyi sıralı hale getirebiliriz. Buna küçük bir örnek verelim. Aşağıdaki kod parçası bir ArrayList oluşturup içine 5 tane String tipinde eleman ekliyor, elemanları sıra ile konsola yazdırıyor, sıralıyor ve son olarak sıralı listeyi konsola yazdırıyor.

import java.util.ArrayList;
import java.util.Collections;

public class ObjectSort {
	/**
	 * @author Oguz
	 */
	public static void main(String[] args) {
		ArrayList mList = new ArrayList();

		mList.add("Black Sabbath");
		mList.add("Judas Priest");
		mList.add("Jimi Hendrix");
		mList.add("Dire Straits");
		mList.add("Pink Floyd");

		// Sıralanmamış listeyi yazdırıyoruz:
		System.out.println("Sıralanmamış dizi:");
		listeyiGoster(mList);

		// listeyi sıralıyoruz
		Collections.sort(mList);

		// Sıralanmış diziyi gösteriyoruz
		System.out.println("Sıralanmış dizi:");
		listeyiGoster(mList);
	}

	private static void listeyiGoster(ArrayList mList) {
		for (int i = 0; i < mList.size(); i++) {
                      System.out.println(i + " -> " + mList.get(i));
		}
	}
}

Kodun çıktısı aşağıdakine benzer olur:

Sıralanmamış dizi:

0 -> Black Sabbath

1 -> Judas Priest

2 -> Jimi Hendrix

3 -> Dire Straits

4 -> Pink Floyd

Sıralanmış dizi:

0 -> Black Sabbath

1 -> Dire Straits

2 -> Jimi Hendrix

3 -> Judas Priest

4 -> Pink Floyd

Elemanlarının tipi Integer, String, Double vs olan listeleri sıralamak basit, peki kendi nesnelerimizi nasıl sıralarız? Mesela String tipinde ad, soyad ve int tipinde doğum yılı alanları olan ‘Ogrenci’ tipinde elemanları olan bir liste. Deneyelim..

Önce Ogrenci classımızı yazalım:

public class Ogrenci {
	private String ad;
	private String soyAd;
	private int dogumYili;

	public Ogrenci(String ad, String soyAd, int dogumYili) {
		super();
		this.ad = ad;
		this.soyAd = soyAd;
		this.dogumYili = dogumYili;
	}

	public String getAd() {
		return ad;
	}

	public void setAd(String ad) {
		this.ad = ad;
	}

	public String getSoyAd() {
		return soyAd;
	}

	public void setSoyAd(String soyAd) {
		this.soyAd = soyAd;
	}

	public int getDogumYili() {
		return dogumYili;
	}

	public void setDogumYili(int dogumYili) {
		this.dogumYili = dogumYili;
	}

    @Override
	public String toString() {
		return this.getAd() + " " + this.getSoyAd() + " :: "
				+ this.getDogumYili();
	}
}

Şimdi main classın içinde elemanlarının tipi Ogrenci olan bir liste oluşturup elemanlar ekleyelim ve konsola yazdıralım.

public static void main(String[] args) {
		ArrayList mList = new ArrayList();

		mList.add(new Ogrenci("F. Oğuz", "ÖZKEROĞLU", 1988));
		mList.add(new Ogrenci("Ad", "SOYAD", 1985));
		mList.add(new Ogrenci("İsim", "SOYİSİM", 2000));
		mList.add(new Ogrenci("Deneme", "YANILMA", 2011));

		// Sıralanmamış listeyi yazdırıyoruz:
		listeyiGoster(mList);
	}
	private static void listeyiGoster(ArrayList<Ogrenci> mList) {
            for (int i = 0; i < mList.size(); i++) {
                System.out.println(i + " -> " + mList.get(i));
           }
        }

Kodun çıktısı aşağıdakine benzer olur:

0 -> F. Oğuz ÖZKEROĞLU :: 1988

1 -> Ad SOYAD :: 1985

2 -> İsim SOYİSİM :: 2000

3 -> Deneme YANILMA :: 2011

Şimdi listeyi sıralamaya çalışalım

Collections.sort(mList);

Bu satırda IDE aşağıdaki uyarıyı veriyor:

‘Bound mismatch: The generic method sort(List) of type Collections is not applicable for the arguments (ArrayList). The inferred type Ogrenci is not a valid substitute for the bounded parameter <T extends Comparable<? super T>>’

Biz metoda listeyi sırala diye verdik ama neye göre sıralaması gerektiğini söylemedik. Ad, soyad ve doğum yılına göre sıralanabilir bir liste. Peki böyle durumlarda ne yapacağız? Sıralanacak türü diğer türdaşları ile karşılaştırılabilir bir forma sokacağız. Bunu yapabilmek için ben şöyle bir yöntem kullandım: Collections sınıfının sort metodunun liste ve Comparator türünden nesneleri parametre olarak alan versiyonunu kullandım. Metodu çağırırken Comparator classımı da oluşturdum. Sonunda aşağıdaki gibi bir kod parçası ortaya çıktı:

public class ObjectSort {
	/**
	 * @author Oguz
	 */
	public static void main(String[] args) {
		ArrayList mList = new ArrayList();

		mList.add(new Ogrenci("F. Oğuz", "ÖZKEROĞLU", 1988));
		mList.add(new Ogrenci("Ad", "SOYAD", 1985));
		mList.add(new Ogrenci("İsim", "SOYİSİM", 2000));
		mList.add(new Ogrenci("Deneme", "YANILMA", 2011));

		// Sıralanmamış listeyi yazdırıyoruz:
		System.out.println("Sıralanmamış liste:");
		listeyiGoster(mList);

		// Listeyi sıralıyoruz
		Collections.sort(mList, new Comparator() {
			@Override
			public int compare(Ogrenci o1, Ogrenci o2) {
				String oName1 = o1.getAd();
				String oName2 = o2.getAd();
				return oName1.compareTo(oName2);
			}
		});

		// Sıralanmamış listeyi yazdırıyoruz:
		System.out.println("Sıralanmış liste:");
		listeyiGoster(mList);

	}

	private static void listeyiGoster(ArrayList<Ogrenci> mList) {
            for (int i = 0; i < mList.size(); i++) {
                System.out.println(i + " -> " + mList.get(i));
           }
        }
}

‘compare’ metoduna Ogrenci türünde aldığı iki nesnenin adlarını alıp birer String’e atmasını ve karşılaştırmayı bu Stringler arasında yapmasını söyledik. Sonuçta da aşağıdaki gibi bir konsol çıktısı oluştu:

Sıralanmamış liste:

0 -> F. Oğuz ÖZKEROĞLU :: 1988

1 -> Ad SOYAD :: 1985

2 -> İsim SOYİSİM :: 2000

3 -> Deneme YANILMA :: 2011

Sıralanmış liste:

0 -> Ad SOYAD :: 1985

1 -> Deneme YANILMA :: 2011

2 -> F. Oğuz ÖZKEROĞLU :: 1988

3 -> İsim SOYİSİM :: 2000

Metoda aldığı öğrencileri adlarına göre sılaramasını söylediğimiz için konsol çıktısında sıralanmış liste ada göre sıralanmış bir liste oldu. Eğer listenin doğum yılına göre sıralanmasını istiyorsak metodumuzu aşağıdaki gibi değiştirmemiz gerekirdi.

Collections.sort(mList, new Comparator() {
			@Override
			public int compare(Ogrenci o1, Ogrenci o2) {
				Integer oYear1 = o1.getDogumYili();
				Integer oYear2 = o2.getDogumYili();
				return oYear1.compareTo(oYear2);
			}
		});

Çıktı da aşağıdaki gibi olur:

Sıralanmamış liste:

0 -> F. Oğuz ÖZKEROĞLU :: 1988

1 -> Ad SOYAD :: 1985

2 -> İsim SOYİSİM :: 2000

3 -> Deneme YANILMA :: 2011

Sıralanmış liste:

0 -> Ad SOYAD :: 1985

1 -> F. Oğuz ÖZKEROĞLU :: 1988

2 -> İsim SOYİSİM :: 2000

3 -> Deneme YANILMA :: 2011

Liste artık dogumYili alanının değerlerine göre sıralı.

Yukarıda yalan – yanlış bilgiler yer alıyor olabilir, okuyanlar böyle bir şeyin farkına varırlarsa lütfen uyarmaktan çekinmesinler.

İlgili olabilecek yazılar:

Java %100 Nesne Yönelimli Bir Programlama Dili Midir?
Java :: Jersey ile RESTful Webservislere Eclipse, Maven ve Apache Tomcat Kullanarak Giriş Yapalım
Android :: JSON Parse İşlemleri – 2
Android :: JSON Parse İşlemleri – 1
Android :: Sayfalar Arası Veri Aktarımı – 1


Java :: Objelerin Sıralanması” yazısına 1 yorum yapılmış.

Bir Cevap Yazın

This site uses Akismet to reduce spam. Learn how your comment data is processed.