查找每个 ListMultiMap Key 的总和
Finding the sum of each ListMultiMap Key
我找不到一种简单的方法来计算 Java 中 ListMultiMap 中所有键的总和。
我有一个 ListMultiMap:
ListMultimap<String, Long> foodCals = ArrayListMultimap.create();
其中包含具有多个值的不同键:
["19/03/2020": 77, 88, 88], ["18/03/2020": 22, 33, 21], ["17/03/2020": 77, 33, 88]
如何求出每个Key的总数?并获得如下输出: 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++;
}
编辑:
对于较旧的 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++;
}
您可能只是希望在遍历 keySet
时对每个 key
的值求和:
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()));
这会导致
{19/03/2020=253, 17/03/2020=198, 18/03/2020=76}
没有 Stream
s 和 lambda 的类似逻辑是:
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");
}
}
我找不到一种简单的方法来计算 Java 中 ListMultiMap 中所有键的总和。
我有一个 ListMultiMap:
ListMultimap<String, Long> foodCals = ArrayListMultimap.create();
其中包含具有多个值的不同键:
["19/03/2020": 77, 88, 88], ["18/03/2020": 22, 33, 21], ["17/03/2020": 77, 33, 88]
如何求出每个Key的总数?并获得如下输出: 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++;
}
编辑:
对于较旧的 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++;
}
您可能只是希望在遍历 keySet
时对每个 key
的值求和:
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()));
这会导致
{19/03/2020=253, 17/03/2020=198, 18/03/2020=76}
没有 Stream
s 和 lambda 的类似逻辑是:
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");
}
}