Java 使用第一行作为键,列值作为数组/列表,将csv转换为地图

Java 使用第一行作为键,列值作为数组/列表,将csv转换为地图,java,Java,我已将此格式数据转换为csv格式- 20017,20018,20019 10,20,30 20,30,40 所以我想用lambda表达式在下面格式的地图上画这个- Map<Integer,Double[]> = new HashMap<>(); [20017={10,20},20018={20,30}, 20019={30,40}] Map=newhashmap(); [20017={10,20},20018={20,30}, 20019={30,40}] 您的逻辑可

我已将此格式数据转换为csv格式-

20017,20018,20019
10,20,30
20,30,40
所以我想用lambda表达式在下面格式的地图上画这个-

Map<Integer,Double[]> = new HashMap<>();
[20017={10,20},20018={20,30}, 20019={30,40}]
Map=newhashmap();
[20017={10,20},20018={20,30}, 20019={30,40}]

您的逻辑可能是这样的:

  • 读取第一行并拆分(“,”)。数组长度是
    numberOfColumns
    。把阵列放在一边

  • 创建一个
    列表
    并将
    numberOfColumns
    列表添加到外部列表中

  • 读剩下的几行。对于每一行,
    split(“,”
    ,并将每个值解析为
    Double
    ,并添加到相应的列列表中

  • 阅读完毕后,使用
    toArray()
    List
    转换为
    Double[]
    ,并在步骤1中使用数组中的键构建最终的
    Map

  • try(BufferedReader BufferedReader=Files.newBufferedReader(path.get(“test.csv”)){
    CSVParser parser=CSVFormat.RFC4180.withFirstRecordAsHeader().parse(bufferedReader);
    Map hearders=parser.getHeaderMap();
    映射数据=新的HashMap();
    parser.getRecords().stream().forEach(rec->{
    hearders.entrySet().forEach(head->{
    computeIfAbsent(head.getKey(),k->newArrayList()).add(Double.parseDouble(rec.get(head.getValue()));
    });
    });
    系统输出打印项次(数据);
    }
    
    一些提示:您面临哪些问题?读取文件?解析内容?绘制地图?到目前为止您尝试了什么?列出列;列表值;try(BufferedReader br=Files.newBufferedReader(path.get(“test.csv”)){String firstLine=br.readLine();if(firstLine==null)抛出新IOException(“空文件”);columns=Arrays.asList(firstLine.split(“,”);values=br.lines().map(line->Arrays.asList(line.split(“,”)).collect(Collectors.toList());System.out.println(列);System.out.println(值);我无法将第一行绑定为键,将其所有值绑定为list@ram不要在评论中发布代码。编辑问题并在那里显示您的代码,以便更好地格式化和可读。这是工作代码,请让我知道是否可以以更好的方式完成。
       try(BufferedReader bufferedReader= Files.newBufferedReader(Paths.get("test.csv"))) {
            CSVParser parser = CSVFormat.RFC4180.withFirstRecordAsHeader().parse(bufferedReader);
            Map<String,Integer> hearders = parser.getHeaderMap();
            Map<String,List<Double>> data = new HashMap<>();
    
            parser.getRecords().stream().forEach(rec -> {
                hearders.entrySet().forEach( head ->{
                    data.computeIfAbsent(head.getKey(), k-> new ArrayList<>()).add(Double.parseDouble(rec.get(head.getValue())));
                });
            });
            System.out.println(data);
        }