如何在java中的地图中得到对(键)值的求和?

时间:2018-04-28 15:00:17

标签: java hashmap

我有一个地图,它代表一个map-int矩阵,映射到一个值:
static Map<Pair<String,Integer>, Integer> wordTopic = new HashMap<>();

我想得到具有特定字符串(该对的一部分)的值的总和而不是整个对Pair<String,Integer> AKA是一行的总和。

示例:矩阵

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 :(得分:1)

我猜这个:

输入:

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

输出:

a = 300
b = 1200

使用map.entries()可能会更容易帮助处理行。

您似乎希望先按字符串分组,因此检查Map.Entry.getKey()。getValue0()的.group()lambda会生成<String, List<Map.Entry>>的映射

并且对于每一个,你会做所需的.map&amp; .sum等(留作家庭作业......)

你可以说,一个好的旧for for循环与另一个hashmap会更具可读性......

答案 1 :(得分:0)

假设配对如下。

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

基本上使用entrySet启动Stream,以便您可以访问Pair kay。然后过滤掉对的词。

答案 2 :(得分:0)

您可以创建一个函数:

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();
}
给出地图和密钥的

将返回对的密钥等于提供的密钥的值的总和。