java - 将文本文件中的数据存储到哈希图中
问题描述
我正在尝试读取文本文件并使用哈希图进行存储。该文件包含如下信息:
1946-01-12;13:00:00;0.3;G
1946-01-12;18:00:00;-2.8;G
1946-01-13;07:00:00;-6.2;G
1946-01-13;13:00:00;-4.7;G
1946-01-13;18:00:00;-4.3;G
1946-01-14;07:00:00;-1.5;G
1946-01-14;13:00:00;-0.2;G
我想将日期存储为键,然后将“13:00:00;0.3;G”作为值存储,其中 13:00 是时间,0.3 是温度,G 代表质量代码。我想知道这是否可能,因为文件中的许多行具有相同的日期?我已经编写了将数据存储在列表中的代码,但现在我想将其存储在地图中。我的旧代码如下所示:
/**
* Provides methods to retrieve temperature data from a weather station file.
*/
public class WeatherDataHandler {
private List<Weather> weatherData = new ArrayList<>();
public void loadData(String filePath) throws IOException {
List<String> fileData = Files.readAllLines(Paths.get("filepath"));
for(String str : fileData) {
List<String> parsed = parseData(str);
LocalDate date = LocalDate.parse(parsed.get(0));
LocalTime time = LocalTime.parse(parsed.get(1));
double temperature = Double.parseDouble(parsed.get(2));
String quality = parsed.get(3);
//new Weather object
Weather weather = new Weather(date, time, temperature, quality);
weatherData.add(weather);
}
}
private List<String> parseData(String s) {
return Arrays.asList(s.split(";"));
}
我在实现哈希图时卡住了。我从下面的一些代码开始,但我不知道如何循环一系列日期。将文件中的数据存储在地图中的最简单方法是什么?
public class WeatherDataHandler {
public void loadData(String filePath) throws IOException {
Map<LocalDate, String> map =new HashMap<LocalDate, String>();
BufferedReader br = new BufferedReader(new FileReader("filepath"));
String line="";
int i=0;
while (line != null) {
line = br.readLine();
map.put(i,line);
i++;
}
String date="";
String time="";
String temperature="";
String quality="";
for(int j=0;j<map.size();j++){
if(!(map.get(j)== null)){
String[] getData=map.get(j).toString().split("\\,");
date = getData[0];
time = getData[1];
temperature = getData[2];
quality = getData[3];
}
}
}
解决方案
使用流 API,您可以创建一个地图,其中键是日期,[map] 值是一个列表。
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
public class WeatherDataHandler {
public static void main(String[] args) {
Path path = Paths.get("filepath");
try {
Map<String, List<String>> map = Files.lines(path)
.collect(Collectors.groupingBy(line -> line.split(";", 2)[0]));
map.entrySet()
.stream()
.forEach(entry -> System.out.printf("%s = %s%n", entry.getKey(), entry.getValue()));
}
catch (IOException x) {
x.printStackTrace();
}
}
}
lines()
类中的方法java.nio.file.Files
创建一个流,其中每个流元素是正在读取的文件的单行。
方法split()
将行拆分为一个双元素数组(因为第二个参数是数字 2)。
第一个数组元素,即日期,成为 [map] 键,而该行的其余部分成为 [map] 值。
每当遇到重复键时,都会将该值附加到现有值中,从而创建一个列表。因此,地图的类型参数用于String
[map] 键和List<String>
[map] 值。
在您的示例数据上运行上述代码会产生:
1946-01-14 = [1946-01-14;07:00:00;-1.5;G, 1946-01-14;13:00:00;-0.2;G]
1946-01-12 = [1946-01-12;13:00:00;0.3;G , 1946-01-12;18:00:00;-2.8;G]
1946-01-13 = [1946-01-13;07:00:00;-6.2;G , 1946-01-13;13:00:00;-4.7;G, 1946-01-13;18:00:00;-4.3;G ]
推荐阅读
- reactjs - React Hooks:将参数传递给自定义 Hook 以动态设置 API 请求查询
- python - 如何在 Odoo 中使用 onchange 功能检查文件扩展名?
- azure - 在虚拟机规模集中查找其他实例
- javascript - 停止要求 VR 权限的嵌入式 Vimeo 播放器
- pandas - Pandas:重命名同一数据框中的重复列并合并
- python - 带有关键字“and”的条件 if 语句给了我意想不到的结果
- r - 如何优化 R 中的多个数组?
- c++ - c++: Is a multiple inheritance from template class and general class valid?
- javascript - 如何在 javascript/jquery 中使用空元素在第三个索引处创建任何数组,例如 ['Aarav', 10, '', , '']
- sql - 使用活动记录查询接口查询 N 个最近的数据库条目