将文本文件中的数据存储到哈希图中

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 ]