Есть ли в любом случае установить значение, которое зависит от результата потока внутри цепочки потока - PullRequest
1 голос
/ 02 апреля 2019

Мне нужно написать цепочку потоков, которая будет возвращать указанный вывод консоли.

Мне удалось получить правильный результат, но мне пришлось разорвать цепочку потоков, и мне интересно, есть ли способ избежать этого

public class Main {
    public static void main(String[] args) throws IOException {
        Map<String, List<String>> map;
        int maxValue;
        map = new BufferedReader(
                new InputStreamReader(
                        new URL("http://wiki.puzzlers.org/pub/wordlists/unixdict.txt")
                                .openStream(), StandardCharsets.UTF_8))
                .lines().flatMap(Pattern.compile("[\\r\\n]")::splitAsStream)
                .collect(Collectors.groupingBy(s -> Stream.of(s.split(""))
                        .sorted().collect(Collectors.joining()), Collectors.toList()));

        maxValue = map.values().stream().mapToInt(List::size).max().getAsInt();

        map.values().stream().filter(l -> l.size() == maxValue).collect(Collectors.toList())
                .stream().sorted(Comparator.comparing(s -> s.get(0))).collect(Collectors.toList()).
                forEach(n -> System.out.println(n.stream().sorted().collect(Collectors.joining(" "))));
    }
}

Я хотел бы получить тот же результат, что и в моем коде, но вместо установки maxValue вне цепочки потоков, он должен быть установлен внутри.

1 Ответ

1 голос
/ 02 апреля 2019

Вы можете использовать TreeMap и его последнюю запись для сбора всех максимальных значений:

new BufferedReader(new InputStreamReader(new URL("http://wiki.puzzlers.org/pub/wordlists/unixdict.txt").openStream(), StandardCharsets.UTF_8))
        .lines()
        .collect(Collectors.groupingBy(s -> Stream.of(s.split("")).sorted().collect(Collectors.joining()), Collectors.toList()))
        .entrySet().stream()
        .collect(Collectors.groupingBy(e -> e.getValue().size(), TreeMap::new, Collectors.toList()))
        .lastEntry().getValue()
        .stream().map(Map.Entry::getValue)
        .sorted(Comparator.comparing(s -> s.get(0)))
        .map(n -> n.stream().sorted().collect(Collectors.joining(" ")))
        .forEach(System.out::println);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...