Java группирование потоков и одновременное присоединение для экспорта в CSV - PullRequest
0 голосов
/ 26 мая 2020

У меня есть список строк: "синий" "красный" "синий" "желтый"

Я хотел бы передать его и получить такой результат:

"синий; 2 \ nred; 1 \ nyellow; 1 "

, так что я получаю csv цветов с подсчетом их вхождений.

пока мне трудно заставить все работать, вот что я иметь:

 public static void main(String[] args) {
        System.out.println(
                List.of("blue", "red", "blue", "yellow")
                        .stream()
                        .collect(Collectors.groupingBy(Function.identity(), Collectors.counting()))
        );
// result: {red=1, blue=2, yellow=1}
    }

Ответы [ 2 ]

2 голосов
/ 26 мая 2020

Просто выполните потоковую передачу по результирующим записям и объедините их, как вы. sh:

String output = Stream.of("blue", "red", "blue", "yellow")
        .collect(Collectors.groupingBy(Function.identity(), Collectors.counting()))
        .entrySet()
        .stream()
      //.sorted(Comparator.comparing(Entry::getValue).reversed())
        .map(e -> e.getKey() + ";" + e.getValue())
        .collect(Collectors.joining("\n"));

Неясно, является ли порядок обязательным, но вы можете раскомментировать строку sorted, чтобы увеличить считается первым.

Обратите внимание, что это не обрабатывает кавычки, избегая et c. Если вам нужен более сложный CSV logi c, вы, вероятно, захотите использовать библиотеку.

0 голосов
/ 26 мая 2020

Провайдер LinkedHashMap отсортирует ключи за вас.

import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;

public class Snippet {
    public static void main(String[] args) {
        List<String> colors = Arrays.asList("blue", "red", "blue", "yellow");

        String output = colors.stream()
                .collect(Collectors.groupingBy(Function.identity(), LinkedHashMap::new,
                        Collectors.counting()))
                .entrySet().stream().map(entry -> entry.getKey() + ";" + entry.getValue())
                .collect(Collectors.joining("\\n"));

        System.out.println(output);// blue;2\nred;1\nyellow;1
    }
}

...