Özel Nesnelerin ArrayListesini özelliğe göre sıralama

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);
    ...
}
Çözüm

Date][1], [Comparable][2]'yi uyguladığından, tıpkıStringgibi bircompareTo` yöntemine sahiptir.

Yani özel Comparator öğeniz şöyle görünebilir:

public class CustomComparator implements Comparator {
    @Override
    public int compare(MyObject o1, MyObject o2) {
        return o1.getStartDate().compareTo(o2.getStartDate());
    }
}

compare()yöntemi birintdöndürmelidir, bu nedenle zaten planladığınız gibi doğrudan birboolean` 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() {
    @Override
    public int compare(MyObject o1, MyObject o2) {
        return o1.getStartDate().compareTo(o2.getStartDate());
    }
});

S Since [tag:java-8]

Ş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.

Yorumlar (12)

Evet, yapabilirsin. Öğeleri karşılaştırmak için iki seçenek vardır: Comparable arayüzü ve Comparator arayüzü.

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.

Yorumlar (0)

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

Yorumlar (0)