Mam listę obiektów, takich jak. List<Object> p
Chcę posortować tę listę alfabetycznie przy użyciu pola Nazwa obiektu. Obiekt zawiera 10 pól, a jednym z nich jest pole nazwy.
if (list.size() > 0) {
Collections.sort(list, new Comparator<Campaign>() {
@Override
public int compare(final Object object1, final Object object2) {
return String.compare(object1.getName(), object2.getName());
}
} );
}
Ale nie ma nic takiego jak String.compare ..?
Object
nie mają nazw. Czy masz na myśli używanie.toString()
?object1
iobject2
muszą być typuCampaign
, a funkcja porównania jestobject1.getName().compareTo(object2.getName())
.List<Object>
iComparator<Campaign>
. Nie możesz tego zrobić. Albo maszList<Object>
iComparator<Object>
lubList<Campaign>
iComparator<Campaign>
Odpowiedzi:
Z twojego kodu wygląda na to, że twój
Comparator
jest już sparametryzowany za pomocąCampaign
. To zadziała tylko zList<Campaign>
. Ponadto metoda, której szukasz, tocompareTo
.Lub jeśli używasz Java 1.8
Ostatnia uwaga - nie ma sensu sprawdzać rozmiaru listy. Sortowanie będzie działać na pustej liście.
źródło
Comparator.comparing(Campaign::getName)
list.sort((object1, object2) -> object1. getName().compareTo(object2. getName()));
pracował dla mniesortedList = list.stream().sort((object1, object2) -> object1. getName().compareTo(object2. getName()))..collect(Collectors.toList());
aby uzyskać nową posortowaną listęNajbardziej poprawnym sposobem alfabetycznego sortowania ciągów jest użycie
Collator
ze względu na internacjonalizację. Niektóre języki mają inną kolejność ze względu na kilka dodatkowych znaków itp.Jeśli nie zależy Ci na internacjonalizacji, użyj
string.compare(otherString)
.źródło
Spójrz na
Collections.sort()
iComparator
interfejs.Porównanie ciągów można wykonać za pomocą
object1.getName().compareTo(object2.getName())
lubobject2.getName().compareTo(object1.getName())
(w zależności od pożądanego kierunku sortowania).Jeśli chcesz, aby sortowanie było niezależne od wielkości liter, zrób to
object1.getName().toUpperCase().compareTo(object2.getName().toUpperCase())
.źródło
nama
zObject
typu? ta odpowiedź nie jest kompletna.Korzystanie z Java 8 Comparator.comparing :
źródło
Zastąp Object swoją klasą, która zawiera pole nazwy
Stosowanie:
źródło
obj1.getName().compareTo(obj2.getName()
zeobj2.getName().compareTo(obj1.getName()
w klasie porównawczycoś jak
źródło
Oto wersja odpowiedzi Roberta B, która działa
List<T>
i sortuje według określonej właściwości String obiektu przy użyciu odbicia i bez bibliotek innych firmźródło
Możesz użyć
sortThisBy()
z kolekcji Eclipse :Jeśli nie możesz zmienić typu listy z
List
:Uwaga: współtworzę kolekcje Eclipse.
źródło
Spróbuj tego:
źródło
Jeśli twoje obiekty mają jakiegoś wspólnego przodka [niech tak będzie
T
], powinieneś użyćList<T>
zamiast tegoList<Object>
i zaimplementować Komparator dla tego T, używając pola nazwy.Jeśli nie masz wspólnego przodka, możesz zaimplementować Comperator i użyć odbicia, aby wyodrębnić nazwę. Zauważ, że użycie odbicia jest niebezpieczne, nie sugerowane i ma złe wyniki, ale umożliwia dostęp do nazwy pola nie wiedząc nic o rzeczywistym typie obiektu [poza tym, że ma pole z odpowiednią nazwą]
W obu przypadkach do sortowania należy użyć Collections.sort () .
źródło
Znalazłem inny sposób na zrobienie tego typu.
źródło
To zakłada listę
YourClass
zamiastObject
, jak wyjaśnił amit .Możesz użyć tego bitu z biblioteki Google Guava:
Pozostałe wymienione odpowiedzi
Comparator
nie są błędne, ponieważOrdering
narzędziaComparator
. To rozwiązanie jest moim zdaniem trochę łatwiejsze, chociaż może być trudniejsze, jeśli jesteś początkującym i nie jesteś przyzwyczajony do korzystania z bibliotek i / lub „programowania funkcjonalnego”.Bezwstydnie skopiowałem tę odpowiedź na moje własne pytanie.
źródło
Korzystanie z wyboru Sortuj
źródło
Collections.sort()
? (2) lista jest typuList<Object>
i dlategolist.get(j).getName()
nie zostanie skompilowana. (3) to rozwiązanie to O (n ^ 2), podczas gdy użycieCollections.sort()
jest lepszym rozwiązaniem O (nlogn).Jeśli używasz a
List<Object>
do przechowywania obiektów podtypu, który ma pole nazwy (nazwijmy podtypNamedObject
), będziesz musiał obniżyć elementy listy, aby uzyskać dostęp do nazwy. Masz 3 opcje, z których najlepsza jest pierwsza:List<Object>
w pierwszej kolejności a, jeśli możesz temu pomóc - zachowaj nazwane obiekty w aList<NamedObject>
List<Object>
elementy do plikuList<NamedObject>
, w trakcie zmniejszania, posortuj, a następnie skopiuj je z powrotemOpcja 3 wyglądałaby tak:
źródło
źródło
Odpowiedź @ Victora zadziałała dla mnie i opublikowałem ją ponownie w Kotlinie na wypadek, gdyby była przydatna dla kogoś innego, kto robi Androida.
źródło