Как сравнить строковые символы, используя поток? - PullRequest
0 голосов
/ 20 января 2019

Я изучая поток, я столкнулся с вопросом.У меня есть список, который мне нужно отсортировать по длине строки, все строки, где есть совпадение символов в верхнем регистре, если их нет, то сортировать по алфавиту.

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);

Я пытаюсьиспользовать совпадения, но я где-то ошибаюсь, поскольку ничего не выводится.Как я могу это исправить?

Ответы [ 2 ]

0 голосов
/ 20 января 2019

Этот ответ для части соответствия регулярному выражению. Вы соответствуете трехсимвольной последовательности A-Z, поэтому ни одна из строк не будет соответствовать.

Я пытался решить эту часть вашего вопроса. Возможный шаблон: .*[A-Z].* Вы можете проверить это здесь .

0 голосов
/ 20 января 2019

Мало что можно исправить, вам нужно убедиться, что есть две разные категории строк, одна из которых имеет заглавную букву, а другая - нет.Для этого вы можете разделить ваш список следующим образом:

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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...