繁体   English   中英

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

[英]how to get summation of pair(key) values in a map in java?

我有一个映射,它表示映射到一个值的 string-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 整个矩阵的值的总和,我只想要行的总和..有什么提示吗?

我认为:

输入:

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 和 .sum 等(留作作业...)

您可能会说带有另一个哈希图的旧 for 循环将更具可读性......

假设 Pair 如下。

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 启动流,这样你就可以访问 Pair kay。 然后过滤成对的词。

您可以创建一个函数:

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

给定一个映射和一个键将返回值的总和,其中 Pair 的键等于提供的键。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM