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);
...
}
Kadangi Date
įgyvendina Comparable
, ji turi compareTo
metodą, kaip ir String
.
Taigi jūsų pasirinktinis Comparator
gali atrodyti taip:
public class CustomComparator implements Comparator<MyObject> {
@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<MyObject>() {
@Override
public int compare(MyObject o1, MyObject o2) {
return o1.getStartDate().compareTo(o2.getStartDate());
}
});
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.
Taip, galite. Yra dvi elementų palyginimo galimybės: Comparable
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ų.
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