Pielāgotu objektu masīva saraksta sakārtošana pēc īpašībām

Es lasīju par masīvu sarakstu šķirošanu, izmantojot salīdzinātāju, bet visos piemēros cilvēki izmantoja compareTo, kas saskaņā ar dažiem pētījumiem ir metode virknēm.

Es gribēju sakārtot pielāgotu objektu masīva sarakstu pēc vienas no to īpašībām: Date objekta. (getStartDay()). Parasti es tos salīdzinu pēc item1.getStartDate().before(item2.getStartDate()), tāpēc man bija jautājums, vai es varētu uzrakstīt kaut ko līdzīgu:

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);
    ...
}
Risinājums

Tā kā Date implementē Comparable, tai ir compareTo metode tāpat kā String metodei.

Tātad jūsu pielāgotais Comparator varētu izskatīties šādi:

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

Metodei compare() ir jāatgriež int, tāpēc jūs nevarētu tieši atgriezt boolean, kā jūs tik un tā plānojāt.

Jūsu šķirošanas kods būtu apmēram tāds, kā jūs rakstījāt:

Collections.sort(Database.arrayList, new CustomComparator());

Nedaudz īsāks veids, kā to visu uzrakstīt, ja jums nav nepieciešams atkārtoti izmantot savu komparatoru, ir uzrakstīt to kā iebūvētu anonīmu klasi:

Collections.sort(Database.arrayList, new Comparator() {
    @Override
    public int compare(MyObject o1, MyObject o2) {
        return o1.getStartDate().compareTo(o2.getStartDate());
    }
});

Since [tag:java-8]

Pēdējo piemēru tagad var uzrakstīt īsākā formā, izmantojot lambda izteiksmi Comparator:

Collections.sort(Database.arrayList, 
                        (o1, o2) -> o1.getStartDate().compareTo(o2.getStartDate()));

Un List ir [sort(Comparator)][5] metode, tāpēc to var saīsināt vēl vairāk:

Database.arrayList.sort((o1, o2) -> o1.getStartDate().compareTo(o2.getStartDate()));

Tā ir tik izplatīta idioma, ka ir iebūvēta metode, lai radītu Comparator klasei ar Comparable atslēgu:

Database.arrayList.sort(Comparator.comparing(MyObject::getStartDate));

Visas šīs ir līdzvērtīgas formas.

[5]: Komparators: //docs.oracle.com/javase/8/docs/api/java/util/List.html#sort-java.util.Comparator-

Komentāri (12)

Jā, varat. Ir divas iespējas salīdzināt vienumus - Comparable saskarne un Comparator saskarne.

Abas šīs saskarnes nodrošina atšķirīgu uzvedību. Salīdzināmā ļauj objektam rīkoties tāpat kā tikko aprakstītajām virknēm (patiesībā virkne īsteno salīdzināmo). Otra saskarne, Comparator, ļauj jums darīt to, ko jūs lūdzat darīt. Jūs to darītu šādi:

Collections.sort(myArrayList, new MyComparator());

Tas liks Collections.sort metodei izmantot jūsu komparatoru kā šķirošanas mehānismu. Ja ArrayList objekti ir salīdzināmi, jūs varat rīkoties šādi:

Collections.sort(myArrayList);

Collections klasē ir vairāki no šiem noderīgajiem, bieži lietotajiem rīkiem.

Komentāri (0)

lai varētu izmantot jūsu pielāgotoComparator klasi, tai jāimplementē java.util.Comparator. tai arī jāpārslēdz compare() UN equals().

compare() jāatbild uz jautājumu: Vai objekts 1 ir mazāks, vienāds vai lielāks par objektu 2?

Pilna dokumentācija: http://java.sun.com/j2se/1.5.0/docs/api/java/util/Comparator.html

Komentāri (0)