Vairāk
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);
...
}
1090
3
Tā kā
Date
implementēComparable
, tai ircompareTo
metode tāpat kāString
metodei.Tātad jūsu pielāgotais
Comparator
varētu izskatīties šādi:Metodei
compare()
ir jāatgriežint
, tāpēc jūs nevarētu tieši atgrieztboolean
, 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:
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:
Since [tag:java-8]
Pēdējo piemēru tagad var uzrakstīt īsākā formā, izmantojot lambda izteiksmi
Comparator
:Un
List
ir [sort(Comparator)
][5] metode, tāpēc to var saīsināt vēl vairāk:Tā ir tik izplatīta idioma, ka ir iebūvēta metode, lai radītu
Comparator
klasei arComparable
atslēgu: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-
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:
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 klasē ir vairāki no šiem noderīgajiem, bieži lietotajiem rīkiem.
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