将文本文件中的数据存储到哈希图中
Store the data from text file to a hashmap
我正在尝试读取文本文件并使用散列图进行存储。该文件包含如下信息:
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(";"));
}
我在实现 hashmap 时卡住了。我从下面的一些代码开始,但我不知道如何遍历一系列日期。将文件中的数据存储在地图中的最简单方法是什么?
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];
}
}
}
使用 stream API 您可以创建一个地图,其中键是日期,[地图] 值是一个列表。
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();
}
}
}
class java.nio.file.Files
中的方法 lines()
创建一个流,其中每个流元素都是正在读取的文件的一行。
方法 split()
将该行拆分为一个双元素数组(因为第二个参数是数字 2)。
第一个数组元素,即日期,成为 [map] 键,该行的其余部分成为 [map] 值。
每当遇到重复的键时,该值就会附加到现有值上,从而创建一个列表。因此,地图的类型参数对于 [map] 键是 String
,对于 [map] 值是 List<String>
。
运行 以上代码对您的示例数据产生:
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 ]
我正在尝试读取文本文件并使用散列图进行存储。该文件包含如下信息:
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(";"));
}
我在实现 hashmap 时卡住了。我从下面的一些代码开始,但我不知道如何遍历一系列日期。将文件中的数据存储在地图中的最简单方法是什么?
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];
}
}
}
使用 stream API 您可以创建一个地图,其中键是日期,[地图] 值是一个列表。
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();
}
}
}
class java.nio.file.Files
中的方法 lines()
创建一个流,其中每个流元素都是正在读取的文件的一行。
方法 split()
将该行拆分为一个双元素数组(因为第二个参数是数字 2)。
第一个数组元素,即日期,成为 [map] 键,该行的其余部分成为 [map] 值。
每当遇到重复的键时,该值就会附加到现有值上,从而创建一个列表。因此,地图的类型参数对于 [map] 键是 String
,对于 [map] 值是 List<String>
。
运行 以上代码对您的示例数据产生:
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 ]