Me estudiar la corriente, me encontré con una pregunta. Tengo una necesidad de la lista I para ordenar por la longitud de la cadena, todas las cuerdas donde hay una coincidencia de caracteres en mayúsculas, si no hay tal, a continuación, ordenar por orden alfabético.
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);
Trato de usar partidos, pero hago un error en alguna parte, ya que no hay ninguna emisión. ¿Cómo puedo arreglar esto?
Pocas cosas a una reparación no habría, es necesario asegurarse de que hay dos clasificaciones diferentes de cuerdas, uno que tiene cualquier letra mayúscula y otro que no lo hace. Para ello se puede crear particiones en la lista como:
Map<Boolean, List<String>> partitionedValues = phones.stream()
.collect(Collectors.partitioningBy(a -> containsUpperCase(a)));
donde containsUpperCase
la aplicación podría ser similar a:
boolean containsUpperCase(String value) {
for (char ch : value.toCharArray()) {
if (Character.isUpperCase(ch)) {
return true;
}
}
return false;
}
Una vez que haya particionado los datos tales como que necesita para sumarlos en una sola lista final como:
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()));
el resultado final sería entonces visible como:
finalOutput.forEach(System.out::println);