Eu tenho aula simples
public class ActiveAlarm {
public long timeStarted;
public long timeEnded;
private String name = "";
private String description = "";
private String event;
private boolean live = false;
}
e List<ActiveAlarm>
contra. Como classificar em ordem crescente por timeStarted
e depois por timeEnded
? Alguém pode ajudar? Eu sei em C ++ com algoritmo genérico e operador de sobrecarga <, mas eu sou novo em Java.
java
sorting
sort-object
Jennifer
fonte
fonte
Respostas:
Crie
ActiveAlarm
implementarComparable<ActiveAlarm>
ou implementeComparator<ActiveAlarm>
em uma classe separada. Então ligue:ou
Em geral, é uma boa idéia para implementar
Comparable<T>
se há uma única ordem de classificação "natural" ... caso contrário (se você acontecer querer classificar em uma ordem específica, mas pode igualmente facilmente quer um diferente) é melhor implementarComparator<T>
. Essa situação em particular poderia ser de qualquer maneira, para ser honesto ... mas eu provavelmente ficaria com aComparator<T>
opção mais flexível .Edição: Exemplo de implementação:
fonte
a = Long.MIN_VALUE, b = 1
..compare
Usando
Comparator
Por exemplo:
Com o Java 8 em diante, você pode simplesmente usar a expressão lambda para representar a instância do Comparator.
fonte
compareTo()
faz? De onde isso vem? Onde eu tenho que defini-lo?getScores()
é o getter para oscores
qual é umList<Integer>
. Quando vocêgetScores().get(0)
recebe umInteger
objeto.Integer
já tem ocompareTo(anotherInteger)
método implementado, você não precisa defini-lo.Resposta JAVA 8 e acima (usando expressões lambda)
No Java 8, expressões Lambda foram introduzidas para tornar isso ainda mais fácil! Em vez de criar um objeto Comparator () com todos os seus andaimes, você pode simplificá-lo da seguinte maneira: (Usando seu objeto como exemplo)
ou ainda mais curto:
Essa declaração é equivalente ao seguinte:
Pense nas expressões Lambda como exigindo apenas que você insira as partes relevantes do código: a assinatura do método e o que é retornado.
Outra parte da sua pergunta foi como comparar com vários campos. Para fazer isso com expressões Lambda, você pode usar a
.thenComparing()
função para combinar efetivamente duas comparações em uma:O código acima classificará a lista primeiro por
timeStarted
e depois portimeEnded
(para os registros que têm o mesmotimeStarted
).Uma última observação: é fácil comparar primitivas 'longas' ou 'int', você pode apenas subtrair uma da outra. Se você estiver comparando objetos ('Long' ou 'String'), sugiro que você use a comparação interna. Exemplo:
EDIT: Obrigado a Lukas Eder por me indicar para
.thenComparing()
funcionar.fonte
Comparator.comparing().thenComparing()
...Collections
mais ligar , pode ligar diretamente para a lista. Por exemplo:myList.sort(Comparator.comparing(Address::getZipCode).thenComparing(Compartor.comparing(Address::getStreetName));
Podemos classificar a lista de duas maneiras:
1. Usando o comparador : quando necessário para usar a lógica de classificação em vários locais Se você quiser usar a lógica de classificação em um único local, poderá escrever uma classe interna anônima da seguinte forma ou extrair o comparador e usá-lo em vários locais
Podemos ter uma verificação nula para as propriedades, se pudéssemos usar 'Long' em vez de 'long'.
2. Usando Comparable (ordenação natural) : Se o algoritmo de classificação sempre se ater a uma propriedade: escreva uma classe que implemente o método 'Comparable' e substitua 'compareTo', conforme definido abaixo
}
método de classificação de chamada para classificar com base em pedidos naturais
fonte
No java8 +, isso pode ser escrito em uma única linha, da seguinte maneira:
collectionObjec.sort(comparator_lamda)
oucomparator.comparing(CollectionType::getterOfProperty)
código:
ou
fonte
Isso deve lhe dar uma idéia aproximada. Feito isso, você pode ligar
Collections.sort()
na lista.fonte
Desde o Java8, isso pode ser feito ainda mais limpo usando uma combinação de
Comparator
eLambda expressions
Por exemplo:
fonte
Guava ComparisonChain :
fonte
Você pode usar
Collections.sort
e passar o seu próprioComparator<ActiveAlarm>
fonte
Em java, você precisa usar o
Collections.sort
método estático . Aqui está um exemplo para uma lista de objetos CompanyRole, classificados primeiro por begin e depois por end. Você pode se adaptar facilmente ao seu próprio objeto.fonte
Você pode chamar Collections.sort () e passar um comparador que você precisa escrever para comparar diferentes propriedades do objeto.
fonte
Como mencionado, você pode classificar por:
Comparable
Comparator
paraCollections.sort
Se você fizer os dois, o
Comparable
será ignorado eComparator
será usado. Isso ajuda que os objetos de valor tenham sua própria lógica,Comparable
que é a classificação mais razoável para seu objeto de valor, enquanto cada caso de uso individual tem sua própria implementação.fonte