Bir Comparator kullanarak ArrayLists'i sıralama hakkında bir şeyler okudum, ancak tüm örneklerde insanlar bazı araştırmalara göre Strings için bir yöntem olan compareTo
kullanmışlar.
Özel nesnelerden oluşan bir ArrayList'i özelliklerinden birine göre sıralamak istedim: bir Tarih nesnesi
(getStartDay()
). Normalde bunları item1.getStartDate().before(item2.getStartDate())
ile karşılaştırıyorum, bu yüzden şöyle bir şey yazıp yazamayacağımı merak ediyordum:
public class CustomComparator {
public boolean compare(Object object1, Object object2) {
return object1.getStartDate().before(object2.getStartDate());
}
}
public class RandomName {
...
Collections.sort(Database.arrayList, new CustomComparator);
...
}
Date][1], [
Comparable][2]'yi uyguladığından, tıpkı
Stringgibi bir
compareTo` yöntemine sahiptir.
Yani özel Comparator
öğeniz şöyle görünebilir:
public class CustomComparator implements Comparator<MyObject> {
@Override
public int compare(MyObject o1, MyObject o2) {
return o1.getStartDate().compareTo(o2.getStartDate());
}
}
compare()yöntemi bir
intdöndürmelidir, bu nedenle zaten planladığınız gibi doğrudan bir
boolean` döndüremezsiniz.
Sıralama kodunuz hemen hemen sizin yazdığınız gibi olacaktır:
Collections.sort(Database.arrayList, new CustomComparator());
Karşılaştırıcınızı yeniden kullanmanız gerekmiyorsa, tüm bunları yazmanın biraz daha kısa bir yolu, onu satır içi bir anonim sınıf olarak yazmaktır:
Collections.sort(Database.arrayList, new Comparator<MyObject>() {
@Override
public int compare(MyObject o1, MyObject o2) {
return o1.getStartDate().compareTo(o2.getStartDate());
}
});
Şimdi Comparator
için bir lambda expression kullanarak son örneği daha kısa bir biçimde yazabilirsiniz:
Collections.sort(Database.arrayList,
(o1, o2) -> o1.getStartDate().compareTo(o2.getStartDate()));
Ve List
bir sort(Comparator)
yöntemine sahiptir, böylece bunu daha da kısaltabilirsiniz:
Database.arrayList.sort((o1, o2) -> o1.getStartDate().compareTo(o2.getStartDate()));
Bu o kadar yaygın bir deyimdir ki, Comparable
anahtarına sahip bir sınıf için bir Comparator
oluşturmak için yerleşik bir yöntem vardır:
Database.arrayList.sort(Comparator.comparing(MyObject::getStartDate));
Bunların hepsi eşdeğer formlardır.
Evet, yapabilirsin. Öğeleri karşılaştırmak için iki seçenek vardır: Comparable
Bu arayüzlerin her ikisi de farklı davranışlara izin verir. Comparable, nesnenin Strings'i tanımladığınız gibi davranmasını sağlar (aslında String, Comparable'ı uygular). İkincisi, Comparator, yapmak istediğiniz şeyi yapmanıza izin verir. Bunu şu şekilde yaparsınız:
Collections.sort(myArrayList, new MyComparator());
Bu, Collections.sort yönteminin sıralama mekanizması için karşılaştırıcınızı kullanmasına neden olacaktır. ArrayList'teki nesneler karşılaştırılabilir ise, bunun yerine şöyle bir şey yapabilirsiniz:
Collections.sort(myArrayList);
Collections]3 sınıfı bu kullanışlı, yaygın araçlardan birçoğunu içerir.
customComparator sınıfınızın kullanılabilmesi için java.util.Comparator'ı uygulaması gerekir. ayrıca compare() VE equals() işlevlerini de geçersiz kılmalıdır
compare() işlevi soruyu yanıtlamalıdır: Nesne 1, nesne 2'den küçük mü, eşit mi veya büyük mü?
tam dokümanlar: http://java.sun.com/j2se/1.5.0/docs/api/java/util/Comparator.html