gpt4 book ai didi

java - map 中特定键的值总和

转载 作者:搜寻专家 更新时间:2023-11-01 01:32:55 25 4
gpt4 key购买 nike

我有一个文本文件,其中的每一行都包含一对名称和数量,如下所示:

Mike 5
Kate 2
Mike 3

我需要按键对这些值求和。我是这样解决的

public static void main(String[] args) {
Map<String, Integer> map = new HashMap<String, Integer>();
try {
Files.lines(Paths.get("/Users/walter/Desktop/stuff.txt"))
.map(line -> line.split("\\s+")).forEach(line -> {
String key = line[0];
if (map.containsKey(key)) {
Integer oldValue = map.get(key);
map.put(key, oldValue + Integer.parseInt(line[1]));
} else {
map.put(line[0], Integer.parseInt(line[1]));
}
});
map.forEach((k,v) -> System.out.println(k + " " +v));

} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
;

}

我实际上如何以更实用的方式改进此代码,并能够更并发地处理数据(使用并行流等)

最佳答案

当你想写函数式代码时,规则是:不要使用forEach。这是一个命令式解决方案,会破坏功能代码。

你想要的是拆分每一行并按第一部分(键)分组,同时对第二部分(值)求和:

Map<String, Integer> map = 
Files.lines(Paths.get("/Users/walter/Desktop/stuff.txt"))
.map(s -> s.split("\\s+"))
.collect(groupingBy(a -> a[0], summingInt(a -> Integer.parseInt(a[1]))));

在这段代码中,我们拆分了每一行。然后,我们使用 Collectors.groupingBy(classifier, downstream) 对流进行分组其中:

  • classifier,这是一个函数,对每个项目进行分类以提取结果Map的键,只返回行的第一部分
  • downstream 是一个收集器,它减少每个具有相同键的值:在本例中,它是 Collectors.summingInt(mapper)它对给定映射器提取的每个整数求和。

作为旁注(如您所知),您可以使用新的 Map.merge(key, value, remappingFunction) 更简单地重写整个 forEach方法,只需调用:

map.merge(line[0], Integer.valueOf(line[1]), Integer::sum);

如果此键不存在,这将使用键 line[0] 和值 Integer.valueOf(line[1]) 放置一个新值,否则,它将使用给定的重映射函数更新 key (在这种情况下是旧值和新值的总和)。

关于java - map 中特定键的值总和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33609079/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com