Eu tenho uma lista de objetos como List<Object> p
. Quero classificar essa lista em ordem alfabética usando o campo Nome do objeto. O objeto contém 10 campos e o campo de nome é um deles.
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());
}
} );
}
Mas não há nada como String.compare ..?
Object
s não têm nomes. Você quer dizer usar.toString()
?object1
eobject2
precisa ser do tipoCampaign
, e a função de comparação éobject1.getName().compareTo(object2.getName())
.List<Object>
eComparator<Campaign>
. Você não pode fazer isso. Ou você temList<Object>
eComparator<Object>
ouList<Campaign>
eComparator<Campaign>
Respostas:
Pelo seu código, parece que seu
Comparator
já está parametrizado comCampaign
. Isso só funcionará comList<Campaign>
. Além disso, o método que você está procurando écompareTo
.Ou se você estiver usando Java 1.8
Um comentário final - não adianta verificar o tamanho da lista. Classificar funcionará em uma lista vazia.
fonte
Comparator.comparing(Campaign::getName)
list.sort((object1, object2) -> object1. getName().compareTo(object2. getName()));
trabalhou para mimsortedList = list.stream().sort((object1, object2) -> object1. getName().compareTo(object2. getName()))..collect(Collectors.toList());
para obter uma nova lista classificadaA maneira mais correta de classificar strings em ordem alfabética é usar
Collator
, por causa da internacionalização. Alguns idiomas têm ordem diferente devido a alguns caracteres extras etc.Se você não se preocupa com a internacionalização, use
string.compare(otherString)
.fonte
Dê uma olhada em
Collections.sort()
e naComparator
interface.A comparação de strings pode ser feita com
object1.getName().compareTo(object2.getName())
ouobject2.getName().compareTo(object1.getName())
(dependendo da direção de classificação desejada).Se você quiser que o tipo seja agnóstico, faça
object1.getName().toUpperCase().compareTo(object2.getName().toUpperCase())
.fonte
nama
doObject
tipo? esta resposta não está completa.Usando Java 8 Comparator.comparing :
fonte
Substitua Object pela sua classe que contém o campo de nome
Uso:
fonte
obj1.getName().compareTo(obj2.getName()
porobj2.getName().compareTo(obj1.getName()
na classe de comparaçãoalgo como
fonte
Aqui está uma versão da resposta de Robert B que funciona para
List<T>
e classificando por uma propriedade String especificada do objeto usando Reflection e nenhuma biblioteca de terceirosfonte
Você pode usar as coleções
sortThisBy()
do Eclipse :Se você não pode alterar o tipo de lista de
List
:Nota: Sou um contribuidor das Coleções Eclipse.
fonte
Experimente isto:
fonte
Se seus objetos têm algum ancestral comum [que seja
T
], você deve usar emList<T>
vez deList<Object>
, e implementar um Comparador para este T, usando o campo de nome.Se você não tiver um ancestral comum, pode implementar um Comperator e usar reflexão para extrair o nome. Observe que não é seguro, não é sugerido e sofre de mau desempenho usar reflexão, mas permite que você acesse um nome de campo sem saber nada sobre o tipo real do objeto [além do fato de que ele tem um campo com o nome relevante]
Em ambos os casos, você deve usar Collections.sort () para classificar.
fonte
Encontrei outra maneira de fazer o tipo.
fonte
Isso pressupõe uma lista de em
YourClass
vez deObject
, conforme explicado por amit .Você pode usar este bit da biblioteca Google Guava:
As demais respostas que mencionam
Comparator
não são incorretas, poisOrdering
implementaComparator
. Esta solução é, na minha opinião, um pouco mais fácil, embora possa ser mais difícil se você for um iniciante e não estiver acostumado a usar bibliotecas e / ou "programação funcional".Copiado descaradamente desta resposta à minha própria pergunta.
fonte
Usando uma classificação de seleção
fonte
Collections.sort()
? (2) a lista é do tipoList<Object>
e, portantolist.get(j).getName()
, não será compilada. (3) esta solução é O (n ^ 2), enquanto o usoCollections.sort()
é uma solução O (nlogn) melhor.Se você estiver usando um
List<Object>
para conter objetos de um subtipo que tem um campo de nome (vamos chamar o subtipoNamedObject
), você precisará reduzir os elementos da lista para acessar o nome. Você tem 3 opções, a melhor das quais é a primeira:List<Object>
em primeiro lugar se você puder evitar - mantenha seus objetos nomeados em umList<NamedObject>
List<Object>
elementos em umList<NamedObject>
downcasting no processo, faça a classificação e copie-os de voltaA opção 3 seria assim:
fonte
fonte
A resposta de @ Victor funcionou para mim e publicá-la novamente aqui em Kotlin para o caso de ser útil para alguém que está fazendo Android.
fonte