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.
Bilgisayar ortamında verilerin sıralı olması birçok işi kolaylaştırır. Arama, ekleme, bölme vs. durumlarında verilerin sıralı olması ile olmaması arasında çok büyük performans farkı olabilir.
Birçok algoritma (örneğin binary search) sıralı veriler üzerinde çalışır. Kullanıcı için de verilerin sıralı olması büyük kolaylık sağlar.
Verilerin sıralanması için birçok algortima geliştirilmiştir.
* Selection Sort
* Bubble sort
* Insertion sort
* Shell sort
* Merge sort
* Heapsort
* Quicksort
* Bucket sort
* Radix sort
* Distribution sort
* Shuffle sort
…
Listeyi uzatmak mümkün. Sıralanacak veririn boyutu, yazılacak kod maliyeti, sistem kaynakları, kullanıcı tercihi vb. durumlara göre herhangi biri tercih edilebilir.
Bunlardan Selection Sort’u inceleyelim. Sayı dizisini kullaracak olursak, algoritma ilk adımda tüm diziyi dolaşacak, en küçük elemanı bulup ilk sıraya yazacak.
Sonra dizinin kalan kısmında aynı işi yeniden yapacak. Kalan kısmı tarayıp en küçük elamanı bulup, ikinci sıraya yazacak. Bu şekilde son elemana kadar gidip en küçükten büyüğe doğru dizimiz sıralanmış olacak.
Viki’de aşağıdaki animasyonu buldum, Selection Sort için hazırlanmış basit bi şey.

Fonksiyon için de C ve Java’da aşağıdaki kodları yazdım. Aynı işi yapan benzer şeyler de yazılabilir.
C/C++ kodu :
void selectionSort (int dizi[], int elemanSayisi)
{
int i, j, enKucuk, temp;
for (i=0; i<elemanSayisi-1; i++)
{
enKucuk = i;
for (j=i+1; j<elemanSayisi; j++)
{
if (dizi[j] < dizi [enKucuk])
enKucuk = j;
}
temp = dizi[i];
dizi[i] = dizi[enKucuk];
dizi[enKucuk] = temp;
}
}
Java kodu :
private static void selectionSort(int [] dizi,int n)
{
int temp;
int enKucuk;
for(int i=0; i<n-1; i++)
{
enKucuk=i;
for(int j=i; j<n; j++)
{
if (dizi[j] < dizi[enKucuk]) enKucuk=j;
}
temp=dizi[i];
dizi[i]=dizi[enKucuk];
dizi[enKucuk]=temp;
}
}
Fonksiyon argüman olarak aldığı diziyi Selection Sort algoritması ile sıralıyor.
İç içe iki tane döngü kullanıldığı için algoritmanın karmaşıklığı O(n²) olur. Küçük boyutlu dizilerde fazla kod yazmaya gerek kalmadan kullanılabilecek bir algoritmadır.