Eu li sobre a classificação de ArrayLists usando um Comparador, mas em todos os exemplos que as pessoas usavam, compareTo
que de acordo com algumas pesquisas são um método para Strings.
Eu queria classificar um ArrayList de objetos personalizados por uma de suas propriedades: um objeto Date ( getStartDay()
). Normalmente eu os comparo, item1.getStartDate().before(item2.getStartDate())
então eu queria saber se eu poderia escrever algo como:
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);
...
}
java
sorting
date
comparator
Samuel
fonte
fonte
Respostas:
Desde
Date
implementaComparable
, ele tem umcompareTo
método comoString
faz.Portanto, seu costume
Comparator
pode ficar assim:O
compare()
método deve retornar umint
, para que você não possa retornar diretamente umboolean
como estava planejando.Seu código de classificação seria exatamente como você escreveu:
Uma maneira um pouco mais curta de escrever tudo isso, se você não precisar reutilizar seu comparador, é escrevê-lo como uma classe anônima embutida:
Desde a java-8
Agora você pode escrever o último exemplo em um formato mais curto usando uma expressão lambda para
Comparator
:E
List
possui umsort(Comparator)
método, para que você possa encurtar ainda mais:Esse é um idioma tão comum que existe um método interno para gerar a
Comparator
para uma classe com umaComparable
chave:Todos estes são formas equivalentes.
fonte
int
e que é melhor usá-loDate#compareTo()
para isso. Por que isso não foi votado acima, a outra resposta está além de mim. Esse link também pode ser útil: Tutorial de pedido de objetos em Sun.com .List.sort()
.As classes que têm uma ordem de classificação natural (um número de classe, por exemplo) devem implementar a interface Comparável, enquanto as classes que não têm uma ordem de classificação natural (uma cadeira de classe, por exemplo) devem receber um comparador (ou um comparador anônimo) classe).
Dois exemplos:
Uso:
fonte
public
na frenteclass
.Para classificar um,
ArrayList
você pode usar o seguinte trecho de código:fonte
Sim você pode. Existem duas opções para comparar itens, a interface Comparável e a interface Comparadora .
Ambas as interfaces permitem um comportamento diferente. Comparable permite que o objeto aja como você acabou de descrever Strings (na verdade, String implementa Comparable). O segundo, Comparador, permite que você faça o que está pedindo. Você faria assim:
Isso fará com que o método Collections.sort use seu comparador para seu mecanismo de classificação. Se os objetos no ArrayList implementarem comparáveis, você poderá fazer algo assim:
A classe Coleções contém várias dessas ferramentas comuns úteis.
fonte
Expressão lambda JAVA 8
OU
fonte
Collections.sort(studList, Comparator.comparing(Student::getFirstName));
studList.sort(Comparator.comparing(Student::getFirstName));
Com o Java 8, você pode usar uma referência de método para o seu comparador:
fonte
Como as tecnologias aparecem todos os dias, a resposta mudará com o tempo. Dei uma olhada no LambdaJ e parece muito interessante.
Você pode tentar resolver essas tarefas com o LambdaJ . Você pode encontrá-lo aqui: http://code.google.com/p/lambdaj/
Aqui você tem um exemplo:
Classificar Iterativo
Classificar com lambda
Obviamente, ter esse tipo de beleza afeta o desempenho (em média 2 vezes), mas você consegue encontrar um código mais legível?
fonte
fonte
A melhor maneira fácil com o JAVA 8 é para o tipo alfabético inglês
Implementação de Classe
Ordenar
Se você deseja classificar para um alfabeto que contenha caracteres que não sejam do inglês, use Localidade ... Abaixo do código, use a classificação de caracteres turcos ...
Implementação de Classe
Ordenar
fonte
Referência de função e método
O
Collections.sort
método pode classificar umList
usando umComparator
passe. IssoComparator
pode ser implementado usando oComparator.comparing
método em que você pode passar uma referência de método conforme necessárioFunction
. Felizmente, o código real é muito mais simples e mais curto que esta descrição.Para Java 8:
ou
Outra maneira é
fonte
A
Java 8
partir de então, não precisamos usarCollections.sort()
diretamente.List
A interface possui umsort()
método padrão :Consulte http://visvv.blogspot.in/2016/01/sorting-objects-in-java-8.html .
fonte
O Java 8 Lambda reduz a classificação.
fonte
Collections.sort(stdList, Comparator.comparing(SomeClass::getName));
Você pode usar o Bean Comparator para classificar qualquer propriedade em sua classe personalizada.
fonte
Sim, isso é possível, por exemplo, nesta resposta, eu ordeno pela propriedade
v
da classeIndexValue
Se você notar aqui, estou criando uma classe interna anônima (que é o Java para fechamentos) e passando diretamente para o
sort
método da classeArrays
Seu objeto também pode ser implementado
Comparable
(é o que String e a maioria das bibliotecas principais em Java fazem), mas isso definiria a "ordem de classificação natural" da classe e não permitirá que você conecte novas.fonte
Comparator
:)Descobri que a maioria das respostas, se não todas, se baseia na classe subjacente (Object) para implementar comparável ou ter uma interface comparável auxiliar.
Não com a minha solução! O código a seguir permite comparar o campo do objeto sabendo o nome da sequência. Você pode modificá-lo facilmente para não usar o nome, mas precisa expô-lo ou construir um dos objetos com os quais deseja comparar.
fonte
Você pode tentar o Guava Ordering :
fonte
Você pode classificar usando java 8
fonte
Esses trechos de código podem ser úteis. Se você deseja classificar um objeto no meu caso, quero classificar por VolumeName:
Isso funciona. Eu uso no meu jsp.
fonte
Com esta biblioteca aqui, você pode classificar a lista de objetos personalizados em várias colunas. A biblioteca usa os recursos da versão 8.0. A amostra também está disponível lá. Aqui está uma amostra para fazer
fonte
Você pode dar uma olhada nesta apresentação no Java Forum em Stuttgart, Alemanha, em 2016.
Apenas alguns slides usam o idioma alemão, 99% do conteúdo é código-fonte Java "baseado em inglês"; gostar
Onde
OurCustomComparator
está usando métodos padrão (e outras idéias interessantes). Como mostrado, levando a um código muito conciso para escolher algum método getter para classificação; e encadeamento super simples (ou reversão) de critérios de classificação.Se você gosta do java8, encontra muito material para começar.
fonte
Novo desde 1.8 é um método List.sort () em vez de usar o Collection.sort (), então você chama diretamente mylistcontainer.sort ()
Aqui está um trecho de código que demonstra o recurso List.sort ():
A classe Fruit é:
fonte
sua classe customComparator deve implementar java.util.Comparator para ser usada. também deve substituir compare () AND igual ()
compare () deve responder à pergunta: O objeto 1 é menor que, igual ou maior que o objeto 2?
documentos completos: http://java.sun.com/j2se/1.5.0/docs/api/java/util/Comparator.html
fonte
Eu prefiro este processo:
Se você listar objetos com uma propriedade chamada
startDate
, você pode usar isso repetidamente. Você pode até encadeá-losstartDate.time
.Isso requer o seu objeto ser
Comparable
que significa que você precisa de umcompareTo
,equals
ehashCode
implementação.Sim, poderia ser mais rápido ... Mas agora você não precisa fazer um novo Comparador para cada tipo de classificação. Se você pode economizar no tempo de desenvolvimento e desistir do tempo de execução, pode optar por este.
fonte
O uso do Java 8 pode definir o
Comparator
em uma linha usandoComparator.comparing()
Use uma das seguintes maneiras:
Opção 1:
Opção 2:
fonte
Sua classe personalizada pode implementar a interface "Comparável", que requer uma implementação do método CompareTo. No método CompareTo, você pode definir o que significa que um objeto é menor ou maior que o outro objeto. Portanto, no seu exemplo, pode ser algo como isto:
..........
Um número negativo indica que este é menor que o objeto que está sendo comparado. Um número positivo indica que isso é maior que o comparado ao objeto e um Zero significa que os objetos são iguais.
Você pode usar o collections.sort (myList) para classificar sua lista sem precisar alimentar um comparador. Esse método também tem a vantagem de classificar as coisas automaticamente, se você usar estruturas de dados de coleção classificada, como um TreeSet ou um TreeMap.
Você pode verificar este artigo se quiser ler mais sobre a interface comparável (divulgação: eu sou o autor;)) https://nullbeans.com/the-java-comparable-interface-automatic-sort-of-collections/
fonte
Você também pode usar o PropertyComparator do Springs se tiver apenas um caminho de propriedade String para a propriedade (aninhada) que deseja classificar:
A desvantagem é que esse comparador ignora silenciosamente propriedades que não existem ou não são acessíveis e lida com isso como valor nulo para comparação. Isso significa que você deve testar cuidadosamente esse comparador ou validar a existência do caminho da propriedade de alguma forma.
fonte
usando a API de fluxo Java-8, você pode classificar
ArrayList
por:fonte
Eu tentei muitas soluções diferentes disponíveis na internet, mas a solução que funciona para mim está disponível no link abaixo.
https://www.java67.com/2017/07/how-to-sort-arraylist-of-objects-using.html
fonte