Java - 使用 POJO 将 CSV 加载到复杂的嵌套地图

Java - Load CSV to Complex Nested Map with POJO

我有 CSV 文件,格式如下

student, year, subject, score1, score2, score3
Alex, 2010, Math, 23, 56, 43
Alex, 2011, Science, 45, 32, 45
Matt, 2009, Art, 34, 56, 75
Matt, 2010, Math, 43, 54, 54

我正在尝试找到一个最佳解决方案来读取 CSV 文件并将其加载到地图以供查找,即 Map<String, Map<String, List<SubjectScore>>>。第一个字符串键是学生,下一个字符串键是年份。

class SubjectScore {
  private String subject;
  private int score1;
  private int score2;
  private int score3;
}

如果有更好的方法来存储 CSV 结构以根据学生和年份信息获取 SubjectScore,我很想知道。

您可以在 SubjectStore 中添加一些构造函数,并使用流读取文件内容并将其转换为您需要的数据结构:

public class SubjectScore {
    private final String subject;
    private final int score1;
    private final int score2;
    private final int score3;

    SubjectScore(String subject, int s1, int s2, int s3) {
        this.subject = subject;
        this.score1 = s1;
        this.score2 = s2;
        this.score3 = s3;
    }

    SubjectScore(String subject, String s1, String s2, String s3) {
        this(subject, Integer.parseInt(s1), Integer.parseInt(s2), Integer.parseInt(s3));
    }
    // getters/toString
}

Map<String, Map<String, List<SubjectScore>>> res = Files.lines(Path.of("data.csv"))
            .skip(1) // skip header line
            .map(line -> line.split("\s*,\s*")) // get columns
            .collect(
                Collectors.groupingBy(arr -> arr[0], TreeMap::new, // key: student
                Collectors.groupingBy(arr -> arr[1], TreeMap::new, // key: year
                Collectors.mapping(arr -> new SubjectScore(arr[2], arr[3], arr[4], arr[5]), Collectors.toList())
            )));