Rūšiuoti pasirinktinių objektų masyvų sąrašą pagal savybę

Skaičiau apie masyvų sąrašų rūšiavimą naudojant komparatorių, tačiau visuose pavyzdžiuose žmonės naudojo compareTo, kuris, remiantis kai kuriais tyrimais, yra eilutėms skirtas metodas.

Norėjau surūšiuoti pasirinktinių objektų ArrayList pagal vieną iš jų savybių: Date objektą (getStartDay()). Paprastai juos lyginu pagal pavyzdys1.getStartDate().before(pavyzdys2.getStartDate()), todėl norėjau sužinoti, ar galėčiau parašyti kažką panašaus:

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);
    ...
}
Sprendimas

Kadangi Date įgyvendina Comparable, ji turi compareTo metodą, kaip ir String.

Taigi jūsų pasirinktinis Comparator gali atrodyti taip:

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

Palyginti() metodas turi grąžinti int, todėl jūs negalėtumėte tiesiogiai grąžinti buleano, kaip planavote.

Jūsų rūšiavimo kodas būtų maždaug toks, kokį parašėte:

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

Jei jums nereikia pakartotinai naudoti komparatoriaus, galite visa tai užrašyti šiek tiek trumpiau - tai parašyti jį kaip eilutinę anoniminę klasę:

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

Dėl [tag:java-8]

Paskutinį pavyzdį galite užrašyti trumpiau, naudodami lambda išraišką Comparator:

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

O List turi sort(Comparator) metodą, todėl galite tai dar labiau sutrumpinti:

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

Tai tokia paplitusi idioma, kad yra įmontuotas metodas, skirtas sukurti Comparator klasei su Comparable raktu:

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

Visos šios formos yra lygiavertės.

Komentarai (12)

Taip, galite. Yra dvi elementų palyginimo galimybės: Comparable sąsaja ir Comparator sąsaja.

Abi šios sąsajos leidžia skirtingai elgtis. Palyginamoji leidžia priversti objektą elgtis taip, kaip ką tik aprašyta eilutė (iš tikrųjų eilutė String įgyvendina palyginamąją). Antroji, Comparator, leidžia daryti tai, ko prašote. Jūs tai darytumėte taip:

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

Tai privers Collections.sort metodą naudoti jūsų komparatorių kaip rūšiavimo mechanizmą. Jei ArrayList objektai yra palyginami, vietoj to galite daryti taip:

Collections.sort(myArrayList);

Klasėje Collections yra keletas tokių naudingų, įprastų įrankių.

Komentarai (0)

kad būtų galima naudoti jūsų pasirinktinęComparator klasę, ji turi įgyvendinti java.util.Comparator. ji taip pat turi būti viršesnė už compare() IR equals().

compare() turi atsakyti į klausimą: Ar objektas 1 yra mažesnis, lygus ar didesnis už objektą 2?

Visi dokumentai: http://java.sun.com/j2se/1.5.0/docs/api/java/util/Comparator.html

Komentarai (0)