Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/383.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 查找每个ListMultiMap键的和_Java_Guava_Multimap - Fatal编程技术网

Java 查找每个ListMultiMap键的和

Java 查找每个ListMultiMap键的和,java,guava,multimap,Java,Guava,Multimap,在Java中,我找不到一种简单的方法来查找ListMultiMap中所有键的总和 我有一张列表地图: ListMultimap foodCals=ArrayListMultimap.create() 包含具有多个值的不同键的: ["19/03/2020": 77, 88, 88], ["18/03/2020": 22, 33, 21], ["17/03/2020": 77, 33, 88] 如何找到每把钥匙的总数?得到一个输出,比如:1-253,2-76,3-198 大概是这样的: int p

在Java中,我找不到一种简单的方法来查找ListMultiMap中所有键的总和

我有一张列表地图:
ListMultimap foodCals=ArrayListMultimap.create()

包含具有多个值的不同键的:

["19/03/2020": 77, 88, 88], ["18/03/2020": 22, 33, 21], ["17/03/2020": 77, 33, 88]
如何找到每把钥匙的总数?得到一个输出,比如:1-253,2-76,3-198

大概是这样的:

int p = 0;
for(String s : foodCals.keySet()){
    System.out.Println(p + foodCals.sumOfKey(p)) //Print the index number + the sumOfKey (sumOfKey doesn't exist).
    p++;
}


没有内置函数可以这样做,但将多重映射视为映射(使用
asMap()
)将为您提供每天的值集合。从这里开始,您只需对它们求和,例如,通过流式处理并将它们转换为基本体:

int p = 0;
for (Collection<Long> vals : foodCals.asMap().values()) {
    System.out.println(p + " - " + vals.stream().mapToLong(Long::longValue).sum());
    p++;
}
int p=0;
对于(集合VAL:foodCals.asMap().values()){
System.out.println(p+“-”+vals.stream().mapToLong(Long::longValue.sum());
p++;
}
编辑:

对于较旧的Java版本(8之前),应该应用相同的逻辑,尽管语法有点笨拙,您必须自己求和这些值:

int p = 0;
for (Collection<Long> vals : foodCals.asMap().values()) {
    long sum = 0L;
    for (Long val : vals) {
        sum += val;
    }
    System.out.println(p + " - " + sum);
    p++;
}
int p=0;
对于(集合VAL:foodCals.asMap().values()){
长和=0L;
用于(长val:val){
sum+=val;
}
系统输出打印项次(p+“-”+和);
p++;
}

在迭代
键集时,您可能只是希望对每个
键的值求和:

ListMultimap<String, Long> foodCals = ArrayListMultimap.create();
Map<String, Long> summingEntries = foodCals.keySet()
        .stream()
        .collect(Collectors.toMap(k -> k,
                k -> foodCals.get(k).stream()
                        .mapToLong(i -> i).sum()));

没有
流和lambdas的类似逻辑为:

Map<String, Long> summingEntries = new HashMap<>();
for (String k : foodCals.keySet()) {
    long sum = 0L;
    for (Long i : foodCals.get(k)) {
        sum += i;
    }
    if (summingEntries.put(k, sum) != null) {
        throw new IllegalStateException("Duplicate key");
    }
}
Map summingEntries=newhashmap();
for(字符串k:foodCals.keySet()){
长和=0L;
用于(长i:foodCals.get(k)){
总和+=i;
}
if(summingEntries.put(k,sum)!=null){
抛出新的IllegalStateException(“复制密钥”);
}
}

对于“Long::longValue”部分,我似乎遇到了“语言级别7不支持方法引用”错误。您知道其他语法吗?@ath现在您不能在旧的Java版本上使用流。你可以总结一下自己——虽然有点笨重,但它仍然有效——看看我编辑过的答案。
Map<String, Long> summingEntries = new HashMap<>();
for (String k : foodCals.keySet()) {
    long sum = 0L;
    for (Long i : foodCals.get(k)) {
        sum += i;
    }
    if (summingEntries.put(k, sum) != null) {
        throw new IllegalStateException("Duplicate key");
    }
}