gpt4 book ai didi

java - java 统计元素出现的频率

转载 作者:行者123 更新时间:2023-12-02 01:02:11 24 4
gpt4 key购买 nike

我正在尝试计算文本文件中所有日期的频率。日期存储在 parsed.get(0) 中,但是当我打印频率时,我得到以下输出:

1946-01-12: 1
1946-01-12: 1
1946-01-12: 1
1946-01-13: 1
1946-01-13: 1
1946-01-13: 1
1946-01-14: 1
1946-01-14: 1
1946-01-14: 1
1946-01-15: 1

而不是

1946-01-12: 3
1946-01-13: 3
1946-01-14: 3
1946-01-15: 1

我想这是因为我必须存储日期,例如(“1946-01-12”,“1946-01-12”,“1946-01-12”,“1946-01-12”,“1946 -01-13”,“1946-01-13”,...)。如果我只是打印 parsed.get(0) 我得到

1946-01-12
1946-01-12
1946-01-12
1946-01-13
1946-01-13
1946-01-13
1946-01-14
1946-01-14
1946-01-14
1946-01-15`

根据下面的代码我该如何解决这个问题?

private static List<WeatherDataHandler> weatherData = new ArrayList<>();
public void loadData(String filePath) throws IOException {

//Read all data
List<String> fileData = Files.readAllLines(Paths.get("filePath"));
System.out.println(fileData);

for(String str : fileData) {
List<String> parsed = parseData(str);
LocalDate dateTime = LocalDate.parse(parsed.get(0));

WeatherDataHandler weather = new WeatherDataHandler(dateTime, Time, temperature, tag);
weatherData.add(weather);

List<String> list = Arrays.asList(parsed.get(0));

Map<String, Long> frequencyMap =
list.stream().collect(Collectors.groupingBy(Function.identity(),
Collectors.counting()));

for (Map.Entry<String, Long> entry : frequencyMap.entrySet()) {
System.out.println(entry.getKey() + ": " + entry.getValue());
}
}

最佳答案

问题

for 循环内的所有内容都会在每次迭代中执行。因此,您正在重新创建日期集合并重新创建流以一遍又一遍地进行分析。不好。

解决方案

将流和分析代码移至 for 循环外部

将您的代码重新思考为两个阶段。

  • 第一阶段是解析输入,将传入数据预处理为您想要使用的形式。在本例中,我们需要读取文本文件,将行解析为 LocalDate 对象,并将这些对象添加到集合中。此代码使用 for 循环。
  • 第二阶段是处理重组数据(LocalDate 对象的集合)的流工作。此代码位于 for 循环之后

在我自己的工作中,我实际上会将这些要点作为注释放入我的代码中。我会添加分隔线(带有一堆注释或常用符号的注释行)来标记代码中的每个阶段。我可能会将每个阶段作为子例程移至一个方法中。

顺便说一句,一旦你让他工作了,为了好玩,你可能想尝试用流替换读取文件的 for 循环。 Java 可以将文件作为行流来读取。

关于java - java 统计元素出现的频率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60510742/

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