J'étudier le flux, je rencontrais une question. J'ai une liste que je besoin de trier par la longueur de la chaîne, toutes les chaînes où il y a un match de caractères en majuscules, s'il n'y a pas tel, puis les trier par ordre alphabétique.
List<String> phones = new ArrayList<>();
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().filter(s -> s.matches("A-Z")).sorted(Comparator.comparingInt(String::length)).forEach(System.out::println);
J'essaie d'utiliser des allumettes, mais je fais une erreur quelque part de, puisque rien est sortie. Comment puis-je réparer cela?
Peu de choses à réparation il y aurait, vous devez vous assurer qu'il ya deux catégorisations différentes de chaînes, celui qui a une lettre majuscule et un autre qui ne fonctionne pas. Pour cela, vous pouvez partitionner votre liste comme:
Map<Boolean, List<String>> partitionedValues = phones.stream()
.collect(Collectors.partitioningBy(a -> containsUpperCase(a)));
où la containsUpperCase
mise en œuvre serait simplement ressembler à :
boolean containsUpperCase(String value) {
for (char ch : value.toCharArray()) {
if (Character.isUpperCase(ch)) {
return true;
}
}
return false;
}
Une fois que vous avez partitionné les données en tant que tel, vous devez regrouper ces derniers dans une seule liste finale:
List<String> finalOutput = partitionedValues.get(Boolean.TRUE) // with upper case
.stream()
.sorted(Comparator.comparing(String::length)) // sorted by length
.collect(Collectors.toList());
finalOutput.addAll(partitionedValues.get(Boolean.FALSE) // without uppercase
.stream()
.sorted(Comparator.naturalOrder()) // sorted naturally
.collect(Collectors.toList()));
votre sortie finale serait alors visible:
finalOutput.forEach(System.out::println);