Daugiau
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);
...
}
1090
3
Kadangi
Date
įgyvendinaComparable
, ji turicompareTo
metodą, kaip irString
.Taigi jūsų pasirinktinis
Comparator
gali atrodyti taip:Palyginti()
metodas turi grąžintiint
, todėl jūs negalėtumėte tiesiogiai grąžintibuleano
, kaip planavote.Jūsų rūšiavimo kodas būtų maždaug toks, kokį parašėte:
Jei jums nereikia pakartotinai naudoti komparatoriaus, galite visa tai užrašyti šiek tiek trumpiau - tai parašyti jį kaip eilutinę anoniminę klasę:
Dėl [tag:java-8]
Paskutinį pavyzdį galite užrašyti trumpiau, naudodami lambda išraišką
Comparator
:O
List
turisort(Comparator)
metodą, todėl galite tai dar labiau sutrumpinti:Tai tokia paplitusi idioma, kad yra įmontuotas metodas, skirtas sukurti
Comparator
klasei suComparable
raktu:Visos šios formos yra lygiavertės.
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:
Tai privers Collections.sort metodą naudoti jūsų komparatorių kaip rūšiavimo mechanizmą. Jei ArrayList objektai yra palyginami, vietoj to galite daryti taip:
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