Мало что можно исправить, вам нужно убедиться, что есть две разные категории строк, одна из которых имеет заглавную букву, а другая - нет.Для этого вы можете разделить ваш список следующим образом:
Map<Boolean, List<String>> partitionedValues = phones.stream()
.collect(Collectors.partitioningBy(a -> containsUpperCase(a)));
, где реализация containsUpperCase
будет выглядеть просто так:
boolean containsUpperCase(String value) {
for (char ch : value.toCharArray()) {
if (Character.isUpperCase(ch)) {
return true;
}
}
return false;
}
После того, как вы разбили данные на части, вам нужно агрегироватьони в единый окончательный список как:
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()));
ваш конечный результат будет виден как:
finalOutput.forEach(System.out::println);