Razvrstitev seznama ArrayList predmetov po meri po lastnosti
Prebral sem o razvrščanju ArrayLists z uporabo komparatorja, vendar so v vseh primerih ljudje uporabili compareTo
, ki je po nekaterih raziskavah metoda za niza.
Želel sem razvrstiti ArrayList predmetov po meri po eni od njihovih lastnosti: predmet Date
(getStartDay()
). Običajno jih primerjam po načelu pomenka1.getStartDate().before(item2.getStartDate())
, zato me je zanimalo, ali lahko napišem kaj takega:
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
Ker
Date
implementiraComparable
, ima metodocompareTo
tako kotString
.Tako bi lahko vaš lastni
Comparator
izgledal takole:Metoda
compare()
mora vrnitiint
, zato ne morete neposredno vrnitiboolean
, kot ste nameravali.Vaša koda za razvrščanje bi bila približno takšna, kot ste jo napisali:
Če vam primerjalnika ni treba ponovno uporabiti, lahko vse to zapišete na nekoliko krajši način, in sicer tako, da ga zapišete kot anonimni razred v vrstici:
Ker [tag:java-8]
Zadnji primer lahko zdaj zapišete v krajši obliki z uporabo izraza lambda za
Comparator
:In
List
ima metodosort(Comparator)
, tako da lahko to še skrajšate:To je tako pogost idiom, da obstaja vgrajena metoda za ustvarjanje
Comparatorja
za razred s ključemComparable
:Vse te oblike so enakovredne.
Da, lahko. Pri primerjanju elementov obstajata dve možnosti: vmesnik Comparable in vmesnik Comparator.
Oba vmesnika omogočata različno obnašanje. Primerjalnik omogoča, da se predmet obnaša tako, kot ste pravkar opisali nizov (v resnici niz implementira primerjalnik). Drugi vmesnik, Comparator, pa vam omogoča, da naredite to, kar ste zahtevali. To bi storili takole:
To bo povzročilo, da bo metoda Collections.sort uporabila vaš komparator za mehanizem razvrščanja. Če so predmeti v seznamu ArrayList primerljivi, lahko namesto tega naredite nekaj takega:
Razred Collections vsebuje številna uporabna in pogosta orodja.
vaš razred po meriComparator mora implementirati java.util.Comparator, da se lahko uporablja. prav tako mora prekrivati compare() IN equals()
compare() mora odgovoriti na vprašanje: Ali je objekt 1 manjši, enak ali večji od objekta 2?
Celotna dokumentacija: http://java.sun.com/j2se/1.5.0/docs/api/java/util/Comparator.html