İçeriğe geç

Java ArrayList Custom Sort

Spread the love

Merhaba bu gün biraz javada kullanılan arraylistlerden de sıralama işleminden bahsedeceğim. Arraylist ile sizde bildiğiniz gibi bir veri kümesini tutarız. Aşağıdaki örnekte bir isim kümesi tutulmaktadır.

1
2
3
4
5
6
7
  ArrayList<String> nameList = new ArrayList<>();
  nameList.add("Osman");
  nameList.add("Mehmet");
  nameList.add("Hüseyin");
  nameList.add("Ayşe");
  nameList.add("Fatma");
  System.out.println(nameList);

Sonuç:

1
       [Osman, Mehmet, Hüseyin, Ayşe, Fatma]

Bu listesinin sort yapılması kolaydır. Arraylist Collection frameworkuna dahil bir obje olduğundan Collections.sort() methodu ile kolaylıkla sort edilebilir durumdır. ilk koda aşağıdaki kod eklendiğinde:

1
2
  Collections.sort(nameList);
  System.out.println(nameList);

Sonuç:

1
2
    [Osman, Mehmet, Hüseyin, Ayşe, Fatma]
    [Ayşe, Fatma, Hüseyin, Mehmet, Osman]

Eğer listede String yerine bir obje kullanmış olsaydık o zaman bir az işle karışacak ve sor işlemi yapılamaycaktır. Objede birden fazla field olabileceğinden dolayı hangi valueya göre sıralama yapılacağına bizim karar vermemiz gerekmektedir. Örneğin User isimli bir pojo sınıfımız olsun.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
package com.ceo.examples.collection;

public class User {
  private int id;
  private String name;
  private String Surname;
  private int age;

  public User(int id, String name, String surname, int age) {
    super();
    this.id = id;
    this.name = name;
    Surname = surname;
    this.age = age;
  }

  public int getId() {
    return id;
  }

  public void setId(int id) {
    this.id = id;
  }

  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }

  public String getSurname() {
    return Surname;
  }

  public void setSurname(String surname) {
    Surname = surname;
  }

  public int getAge() {
    return age;
  }

  public void setAge(int age) {
    this.age = age;
  }

}

Örneğin aşağıdaki gibi bir liste oluştururalım

1
2
3
4
5
6
7
8
    ArrayList<User> userList = new ArrayList<>();
    userList.add(new User(1, "Osman", "Çetin", 29));
    userList.add(new User(2, "Ekin", "Çetin", 29));
    userList.add(new User(3, "Açelya", "Taşçı", 33));
    userList.add(new User(4, "Aslı", "Güven", 28));
    userList.add(new User(5, "Hüseyin", "Yeşiltepe", 28));
    userList.add(new User(6, "Ali", "Veli", 29));
    Collections.sort(userList);

IDE benim için eclipse Collections.sort(userList); satırında bir hata vermektedir.

Collections.sort error
Collections.sort error

Burada cast işlemi yapılsada ide hata vermeye devam etmektedir. Aslında yapılması gerek Bir ikinci parametre olarak Comparator Interface ini geçilmesi gerekmektedir.

1
2
3
4
5
    Collections.sort(userList, new Comparator<User>() {
      public int compare(User o1, User o2) {
        return o1.getName().toUpperCase().compareTo(o2.getName().toUpperCase());
      }
    });

Böylece isme göre sıralmaış olduk ve sonuç şu şekilde çıkacak

1
2
3
4
5
6
7
8
9
10
11
12
13
14
Sort Öncesi
[User [id=1, name=Osman, Surname=Çetin, age=29],
User [id=2, name=Ekin, Surname=Çetin, age=29],
User [id=3, name=Açelya, Surname=Taşçı, age=33],
User [id=4, name=Aslı, Surname=Güven, age=28],
User [id=5, name=Hüseyin, Surname=Yeşiltepe, age=28],
User [id=6, name=Ali, Surname=Veli, age=29]]
Sort Sonrası
[User [id=6, name=Ali, Surname=Veli, age=29],
User [id=4, name=Aslı, Surname=Güven, age=28],
User [id=3, name=Açelya, Surname=Taşçı, age=33],
User [id=2, name=Ekin, Surname=Çetin, age=29],
User [id=5, name=Hüseyin, Surname=Yeşiltepe, age=28],
User [id=1, name=Osman, Surname=Çetin, age=29]]

Eğer objeler yazdırılacak sa Objelerdeki toString methodunun @Override edilmesi gerekmektedir.

Eclipse toString Override
Eclipse toString Override

Görüldüğü üzere İsimlere göre sıralama yapılmıştır. İhtiyaca göre bazen iki field içinde sort yapılması gerekmektedir. Örneği aynı yaşta olanları isim sırasına sokmak istersek eğer:

1
2
3
4
5
6
7
8
9
10
11
    Collections.sort(userList, new Comparator<User>() {
  public int compare(User o1, User o2) {
    if (o1.getAge() > o2.getAge()) {
      return 1;
    } else if (o1.getAge() < o2.getAge()) {
      return -1;
    } else {
      return o1.getName().toUpperCase().compareTo(o2.getName().toUpperCase());
    }
  }
});

Sonuç:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
Sort Öncesi
[User [id=1, name=Osman, Surname=Çetin, age=29],
User [id=2, name=Ekin, Surname=Çetin, age=29],
User [id=3, name=Açelya, Surname=Taşçı, age=33],
User [id=4, name=Aslı, Surname=Güven, age=28],
User [id=5, name=Hüseyin, Surname=Yeşiltepe, age=28],
User [id=6, name=Ali, Surname=Veli, age=29]]
Sort Sonrası
[User [id=4, name=Aslı, Surname=Güven, age=28],
User [id=5, name=Hüseyin, Surname=Yeşiltepe, age=28],
User [id=6, name=Ali, Surname=Veli, age=29],
User [id=2, name=Ekin, Surname=Çetin, age=29],
User [id=1, name=Osman, Surname=Çetin, age=29],
User [id=3, name=Açelya, Surname=Taşçı, age=33]]

Yukarıdaki örneklerde görüldüğü üzere liste ilk olarak yaşa göre daha sonra isme göre sıralandı. Burada önemli olan if yapısında iki objenin fieldlarının eşit olduğu durumlarda bir sonraki kontrole geçmektir.

Bu sıralama bu şekilde yapılabildiği gibi aynı işlem user classı içerisinde de yapılabilir. Bu tamamen kodun nasıl yazıldığına bağlıdır veya sort işlemine ne kadar çok ihtiyaç duyulduğuna bağlıdır. Eğer sort işlemi bir kaç kere yapılacak ise kod içerisine yazmak iyi olur. Fakat bir kaç defadan fazla yazılacak ise aşağıdaki kod bloku gibi yazılabilir.

1
2
3
4
5
6
7
8
9
10
11
12
  public static Comparator<User> SortList = new Comparator<User>() {
    @Override
    public int compare(User o1, User o2) {
      if (o1.getAge() > o2.getAge()) {
        return 1;
      } else if (o1.getAge() < o2.getAge()) {
        return -1;
      } else {
        return o1.getName().toUpperCase().compareTo(o2.getName().toUpperCase());
      }
    }
  };

Kullanışı ise:

1
Collections.sort(userList, User.SortList);
Tarih:eclipseJavaYazılım

İlk Yorumu Siz Yapın

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

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