java - java中元素的计数频率
问题描述
我正在尝试计算文本文件中所有日期的频率。日期存储在 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 可以将文件作为行流读取。
推荐阅读
- angular - HttpClient Angular CORS Twilio
- java - 根据 OIM 中的自定义属性值搜索用户
- c++ - 将整数变量地址分配给类指针
- java - 我的应用程序中的 Paytm 集成
- django - 可以在 Django 中为 slack slash command api mad 禁用 CSRF 吗?
- android - 用于数据发布的 react-native 中的表与 Listview
- java - 在 Spring Maven 项目中添加 web.xml
- java - 反射 - 使用 Long 和 Number 参数调用方法
- php - 如何在循环中访问 ["val1","val2","val3"] 等数组中的 PHP 值
- javascript - 点击时输入关闭列表,但不应该