Mefisto_Fell:
Eu estudo a API de fluxo, eu tenho essa tarefa. Eu preciso classificar a coleção Lista no fim do seu comprimento, se os comprimentos de várias linhas são as mesmas, então classificar-los em ordem alfabética.
Meu código:
List<String> phones = new ArrayList<String>();
Collections.addAll(phones, "iPhone X", "Nokia 9", "Huawei Nexus 6P",
"Samsung Galaxy S8", "LG G6", "Xiaomi MI6", "Sony Xperia Z5",
"ASUS Zenfone 3", "Meizu Pro 6", "Heizu Pro 6",
"Pixel 2");
phones.stream().sorted(Comparator.comparingInt(String::length).reversed()).forEach(System.out::println);
Eu tenho esse resultado:
Samsung Galaxy S8
Huawei Nexus 6P
Sony Xperia Z5
ASUS Zenfone 3
Meizu Pro 6
Heizu Pro 6
Xiaomi MI6
iPhone X
Nokia 9
Pixel 2
LG G6
Como você vê as linhas
Sony Xperia Z5
ASUS Zenfone 3
E linhas:
Meizu Pro 6
Heizu Pro 6
Mas o meu resultado tem que ser:
Samsung Galaxy S8
Huawei Nexus 6P
ASUS Zenfone 3
Sony Xperia Z5
Heizu Pro 6
Meizu Pro 6
Xiaomi MI6
iPhone X
Nokia 9
Pixel 2
LG G6
Como posso melhorar o meu código para que, se os comprimentos são os mesmos, então a ordenação é alfabética?
Como podemos fazer resultados Recolher em List>? Onde List <Pair <String, Long>
, por exemplo:
String a = Abcd;
list.add(new Pair(a, a.length));
Charles Dowbecki:
Adicione thenComparing()
a sua cadeia de comparação para criar uma ordem de classificação secundária. Ele será aplicado quando tipo primário não é suficiente:
phones.stream()
.sorted(Comparator.comparingInt(String::length).reversed()
.thenComparing(Function.identity()))
.forEach(System.out::println);