Уменьшите HashMap к другому HashMap - PullRequest
3 голосов
/ 16 марта 2019

Я начинаю со строки, подобной этой:

"train, Train, bike, BIKE, car...etc"

типов путешествий, и мне нужно вернуть HashMap<String, Integer>(), например:

(train, 4), (car, 6), (bike, 2)

Число указывает количество раз, которое тип путешествия был замечен

Насколько я знаю, отображение строки в исходное хеш-изображение выглядит так:

(train, 1), (train, 1), (car, 1), (car, 1)...etc

with:

public static HashMap<String, Integer> countTravelTypes(String travelTypes) {
    return Arrays.stream(travelTypes.toLowerCase().replace(" ", "")
            .split(","))
            .map(s -> new HashMap<String, Integer>(){{put(s, 1);}})
            //The line below isn't right but it's as close as I could get
            .reduce(0, map -> map.key, Integer.sum(v))
}

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

Ответы [ 2 ]

4 голосов
/ 16 марта 2019

Мы можем использовать Collectors.summingInt() для вывода Карта типа Map<String, Integer>:

Map<String, Integer> result =  
Stream.of("train, Train, bike, BIKE, car, BIKE, Train".split(", "))
      .collect(Collectors.groupingBy(i -> i, Collectors.summingInt(i -> 1)));
4 голосов
/ 16 марта 2019

Вы можете использовать коллектор groupingBy совместно с нижестоящим коллектором counting, чтобы выполнить эту задачу.Вот как это выглядит.

Map<String, Long> result = Arrays.stream(source.split(","))
    .map(String::trim)
    .map(String::toLowerCase)
    .collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...