首页 > 解决方案 > 将文本文件中的数据存储到哈希图中

问题描述

我正在尝试读取文本文件并使用哈希图进行存储。该文件包含如下信息:

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];
                    }
                }
            }

标签: javadata-structureshashmapstoring-data

解决方案


使用流 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 ]

推荐阅读