У меня есть список объектов вроде. List<Object> p
Я хочу отсортировать этот список в алфавитном порядке, используя поле имени объекта. Объект содержит 10 полей, и поле имени является одним из них.
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());
}
} );
}
Но нет ничего лучше String.compare ..?
Object
s не имеют имен. Вы имеете в виду использование.toString()
?object1
иobject2
должны быть типаCampaign
, а функция сравнения -object1.getName().compareTo(object2.getName())
.List<Object>
иComparator<Campaign>
. Вы не можете этого сделать. Либо у вас естьList<Object>
и,Comparator<Object>
либоList<Campaign>
иComparator<Campaign>
Ответы:
Из вашего кода похоже, что ваш
Comparator
уже параметризованCampaign
. Это будет работать только сList<Campaign>
. Кроме того, метод, который вы ищетеcompareTo
.Или, если вы используете Java 1.8
И последнее замечание - нет смысла проверять размер списка. Сортировка будет работать с пустым списком.
источник
Comparator.comparing(Campaign::getName)
list.sort((object1, object2) -> object1. getName().compareTo(object2. getName()));
работал у меняsortedList = list.stream().sort((object1, object2) -> object1. getName().compareTo(object2. getName()))..collect(Collectors.toList());
чтобы получить новый отсортированный списокСамый правильный способ сортировки строк по алфавиту - использовать
Collator
из-за интернационализации. Некоторые языки имеют другой порядок из-за небольшого количества дополнительных символов и т. Д.Если вас не волнует интернационализация, используйте
string.compare(otherString)
.источник
Посмотрите
Collections.sort()
и томуComparator
интерфейс.Сравнение строк может быть сделано с
object1.getName().compareTo(object2.getName())
илиobject2.getName().compareTo(object1.getName())
( в зависимости от направления сортировки вы желаете).Если вы хотите, чтобы сортировка была независимой от случая, сделайте это
object1.getName().toUpperCase().compareTo(object2.getName().toUpperCase())
.источник
nama
изObject
типа? этот ответ неполный.Использование Java 8 Comparator.comparing :
источник
Пожалуйста, замените Object своим классом, который содержит поле имени
Использование:
источник
obj1.getName().compareTo(obj2.getName()
сobj2.getName().compareTo(obj1.getName()
в классе компараторачто-то вроде
источник
Вот версия ответа Роберта Б, которая работает
List<T>
и сортирует указанное свойство String объекта с использованием Reflection и без сторонних библиотек.источник
Вы можете использовать
sortThisBy()
из коллекций Eclipse :Если вы не можете изменить тип списка
List
:Примечание: я участвую в Eclipse Collections.
источник
Попробуй это:
источник
Если у ваших объектов есть общий предок [пусть будет
T
], вы должны использоватьList<T>
вместо негоList<Object>
и реализовать Comparator для этого T, используя поле имени.Если у вас нет общего предка, вы можете реализовать Comperator и использовать отражение для извлечения имени.Обратите внимание, что использование отражения небезопасно, не рекомендуется и страдает от плохой производительности, но оно позволяет вам получить доступ к имени поля. ничего не зная о фактическом типе объекта [кроме того факта, что у него есть поле с соответствующим именем]
В обоих случаях для сортировки следует использовать Collections.sort () .
источник
Я нашел другой способ сделать шрифт.
источник
Это предполагает список
YourClass
вместоObject
, как объяснил amit .Вы можете использовать этот бит из библиотеки Google Guava:
Другие ответы , которые упоминаются
Comparator
не неправильно, так какOrdering
орудияComparator
. Это решение, на мой взгляд, немного проще, хотя может быть сложнее, если вы новичок и не привыкли использовать библиотеки и / или «функциональное программирование».Без зазрения совести скопировал этот ответ на свой вопрос.
источник
Использование выборочной сортировки
источник
Collections.sort()
? (2) список имеет типList<Object>
и поэтомуlist.get(j).getName()
не будет компилироваться. (3) это решение O (n ^ 2), тогда как использованиеCollections.sort()
является лучшим решением O (nlogn).Если вы используете a
List<Object>
для хранения объектов подтипа, у которого есть поле имени (позволяет вызвать подтипNamedObject
), вам нужно будет уменьшить элементы списка, чтобы получить доступ к имени. У вас есть 3 варианта, лучший из которых - первый:List<Object>
в первую очередь, если вы можете помочь - храните свои именованные объекты вList<NamedObject>
List<Object>
элементы вList<NamedObject>
, понижая в процессе, выполните сортировку, затем скопируйте их обратноВариант 3 будет выглядеть так:
источник
источник
Ответ @Victor сработал для меня, и я разместил его здесь, в Котлине, на случай, если это будет полезно для кого-то еще, занимающегося Android.
источник