Eu tenho uma lista de duplas em java e quero classificar ArrayList em ordem decrescente.
ArrayList de entrada é como abaixo:
List<Double> testList = new ArrayList();
testList.add(0.5);
testList.add(0.2);
testList.add(0.9);
testList.add(0.1);
testList.add(0.1);
testList.add(0.1);
testList.add(0.54);
testList.add(0.71);
testList.add(0.71);
testList.add(0.71);
testList.add(0.92);
testList.add(0.12);
testList.add(0.65);
testList.add(0.34);
testList.add(0.62);
A saída deve ser assim
0.92
0.9
0.71
0.71
0.71
0.65
0.62
0.54
0.5
0.34
0.2
0.12
0.1
0.1
0.1
java
sorting
arraylist
collections
Himanshu
fonte
fonte
Comparator
:)Double
s.reverse
, mas a ordenação descendente pode ser mais rápida do que a ordenação ascendente e a inversão. Além disso, o uso de uma implementação de Lista que suportaComparator
como argumento construtor (mantendo-o invariável) garantiria que a lista fosse classificada o tempo todo.Collections.sort
usacompareTo
nos bastidores.Collections.sort(list, Collections.reverseOrder());
. Além de ser mais idiomático (e possivelmente mais eficiente), o uso do comparador de ordem inversa garante que a classificação seja estável (o que significa que a ordem dos elementos não será alterada quando forem iguais de acordo com o comparador, enquanto a reversão mudará a ordem )Descendente:
fonte
CustomData
éList<AnotherModel>
qualAnotherModel
temid
e quero classificar porid
? E acabei de acessar oCustomData
modelo na minha turma.Integer.compare(rhs.customInt, lhs.customInt);
Use o método util da classe java.util.Collections , ou seja,
De fato, se você deseja classificar objetos personalizados, pode usar
ver coleções api
fonte
Para o seu exemplo, isso fará a mágica no Java 8
Mas se você deseja classificar por alguns dos campos do objeto que está classificando, pode fazê-lo facilmente:
ou
ou
Fontes: https://docs.oracle.com/javase/8/docs/api/java/util/Comparator.html
fonte
Usando lambdas (Java8) e reduzindo-o até a menor sintaxe (a JVM inferirá bastante nesse caso), você obtém:
Uma versão mais detalhada:
O uso de um lambda é possível porque a interface do Comparator possui apenas um único método para implementar, para que a VM possa inferir qual método está implementando. Como os tipos de parâmetros podem ser inferidos, eles não precisam ser especificados (ou seja, em
(a, b)
vez de(Double a, Double b)
. E como o corpo lambda possui apenas uma linha, e o método deve retornar um valor, o valorreturn
é inferido e as chaves) não são necessários.fonte
No Java8, existe um método de classificação padrão na interface da Lista que permitirá que você classifique a coleção se você fornecer um Comparador. Você pode facilmente classificar o exemplo na pergunta da seguinte maneira:
Nota: os argumentos no lambda são trocados quando passados para o Double.compare para garantir que a classificação seja decrescente
fonte
locationDetails.sort((locationDetailAsc,locationDetailsDsc) -> Long.compare(locationDetailsDsc.getSnapshot().getQuantity(), locationDetailAsc.getSnapshot().getQuantity()));
Você pode usar
Collections.sort(list)
para classificarlist
se o seulist
contémComparable
elementos. Caso contrário, eu recomendaria que você implementasse essa interface como aqui:e, é claro, forneça sua própria realização do
compareTo
método, como aqui:E então você pode usar novamente
Colection.sort(list)
como agora a lista contém objetos do tipo Comparável e pode ser classificada. A ordem depende docompareTo
método. Verifique este https://docs.oracle.com/javase/tutorial/collections/interfaces/order.html para obter informações mais detalhadas.fonte
Collections.sort
permite passar uma instância de umaComparator
que define a lógica de classificação. Portanto, em vez de classificar a lista em ordem natural e depois revertê-la, basta passarCollections.reverseOrder()
para asort
ordem de classificação inversa:Conforme mencionado por @ Marco13, além de ser mais idiomático (e possivelmente mais eficiente), o uso do comparador de ordem inversa garante que a classificação seja estável (o que significa que a ordem dos elementos não será alterada quando forem iguais, de acordo com o comparador, enquanto a reversão mudará a ordem)
fonte
fonte
Aqui está uma pequena folha de dicas que cobre casos típicos:
fonte
se você estiver usando o Java SE 8, isso pode ser útil.
fonte
Collections.reverseOrder()
não há argumentos, o que torna sua implementação decompareDouble
supérflua (é equivalente à ordenação natural deDouble
s). A resposta aqui deve serCollections.sort(testList, Collections.reverseOrder());
| * | Classificando uma lista:
| => Classificar ordem crescente:
| => Classificar ordem Dsc:
| * | Inverta a ordem da lista:
fonte
Você pode fazer assim:
A coleção possui um comparador padrão que pode ajudá-lo com isso.
Além disso, se você quiser usar alguns novos recursos do Java 8, poderá fazer o seguinte:
fonte
Por exemplo, eu tenho uma classe Person: String name, int age ==> Construtor new Person (nome, idade)
fonte
if you want to short by name
->if you want to sort by name
No JAVA 8, é muito fácil agora.
- Para uso inverso,
fonte
Você pode usar assim
fonte
Com o Eclipse Collections, você pode criar uma lista dupla primitiva, classificá-la e, em seguida, inverter para colocá-la em ordem decrescente. Essa abordagem evitaria o boxe das duplas.
Se você deseja um
List<Double>
, o seguinte funcionaria.Se você deseja manter o tipo como
ArrayList<Double>
, pode inicializar e classificar a lista usando aArrayListIterate
classe de utilitário da seguinte maneira:Nota: Sou um colaborador das Coleções Eclipse .
fonte
A linha a seguir deve fazer a espessura
fonte