Как получить суммирование парных (ключевых) значений на карте в Java? - PullRequest
0 голосов
/ 28 апреля 2018

У меня есть карта, которая представляет собой матрицу string-int, отображающую значение:
static Map<Pair<String,Integer>, Integer> wordTopic = new HashMap<>();

Я хочу получить суммирование значений, в которых есть конкретная строка (часть пары), а не вся пара Pair<String,Integer> АКА суммирование одной строки.

Пример: матрица

string/int 1 2 value1 13 26 value2 11 22

Я хочу, чтобы сумма значений строк в строке "value1" ..output должна быть равна = 39

Я нашел это: Integer integerSum = wordTopic.values().stream().mapToInt(Integer::intValue).sum(); но это даст мне суммирование значений всего ключа AKA всей матрицы, я хочу, чтобы суммирование только строки .. любые советы?

Ответы [ 3 ]

0 голосов
/ 28 апреля 2018

Я предполагаю это:

Введите:

a-1 = 100
a-2 = 200
b-4 = 400
b-8 = 800

Выход:

a = 300
b = 1200

Использование map.entries (), вероятно, поможет легче разобраться со строкой.

Похоже, вы хотите сначала сгруппировать по строкам, поэтому лямбда .group (), проверяющая Map.Entry.getKey (). GetValue0 (), создаст карту <String, List<Map.Entry>>

и для каждого из них вы должны сделать желаемое .map & .sum и т. Д. (Оставьте в качестве домашней работы ...)

Вы, вероятно, можете сказать, что старый добрый цикл for с другим hashmap будет более читабельным ...

0 голосов
/ 28 апреля 2018

Вы можете создать такую ​​функцию:

int getSummationOfValuesByKey(Map<Pair<String,Integer>, Integer> map, String key) {
          return map.entrySet()
                    .stream()
                    .filter(e -> e.getKey().getKey().equals(key))
                    .mapToInt(Map.Entry::getValue)
                    .sum();
}

, который дал карту и ключ, вернет суммирование значений, где ключ пары равен предоставленному ключу.

0 голосов
/ 28 апреля 2018

Предполагается, что пара выглядит следующим образом.

public class Pair<T, U> {

    public final T first;
    public final U second;

    public static <T, U> Pair<T, U> of(T first, U second) {
        return new Pair<>(first, second);
    }

    public Pair(T first, U second) {
        this.first = first;
        this.second = second;
    }

}

Тогда как насчет:

    String wordToFilterFor = "abc";
    Integer integerSum = wordTopic.entrySet()
            .stream()
            .filter(entry -> entry.getKey().first.equals(wordToFilterFor))
            .map(e -> e.getValue())
            .mapToInt(Integer::intValue).sum();

По сути, запускаем Stream с набором entry, чтобы у вас был доступ к Pair kay. Затем отфильтруйте слово пары.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...