我有一个地图,它代表一个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的值的总和,我只想要行的总和。任何提示?
答案 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();
}
给出地图和密钥的将返回对的密钥等于提供的密钥的值的总和。