首页 > 解决方案 > 遍历二维数组并将值放入映射

问题描述

我想迭代这个二维数组并将值作为键和字符串列表放入字符串映射中基本上我有这个但我无法修改值列表以在键已经存在的情况下添加另一个值

  static float bestAverageStudent(String[][] students) {
        Map<String, List<String>> grades = new HashMap<>();
        for (int row = 0; row < students.length; row++) {
            for (int col = 0; col < students[row].length; col++) {
                if (grades.get(students[row][0]) == null) {
                    grades.put(students[row][0], Arrays.asList(students[col][1]));
                } else {
                    List<String> strings1 = grades.get(students[row][0]);
                    strings1.add( students[col][1]);               //It fails when i try to add to the list
                    grades.put(students[row][0], new ArrayList<>(strings1));
                }
            }
        }
        System.out.println(grades);
        return 0;

这是数组

 public static String students[][] = new
            String[][]{{"jerry", "65"},
            {"bob", "91"},
            {"jerry", "23"},
            {"Eric", "83"}};

我想将此记录保存在地图中,其中值是一个学生的成绩列表

谢谢

标签: java

解决方案


第一个问题来自Java List.add() UnsupportedOperationException ,它为您提供Returns a fixed-size list,您需要将其包装在ArrayListlikenew ArrayList<>(Arrays.asList(...))

而且,您不需要对数组进行两次迭代,因为您知道它的结构,只需迭代到第一个数组并访问 2 个值:

Map<String, List<String>> grades = new HashMap<>();
for (int row = 0; row < students.length; row++) {
    String name = students[row][0];
    String grade = students[row][1];
    if (!grades.containsKey(name)) {
        grades.put(name, new ArrayList<>(Arrays.asList(grade)));
    } else {
        List<String> strings1 = grades.get(name);
        strings1.add(grade);
        grades.put(name, new ArrayList<>(strings1));
    }
}

使用Streams

Map<String, List<String>> grades = Arrays.stream(students)
                .collect(groupingBy(values -> values[0], mapping(values -> values[1], toList())));

推荐阅读