【问题标题】:Iterate through a 2D array and put values to map [duplicate]遍历二维数组并将值放入映射 [重复]
【发布时间】:2020-07-03 01:02:00
【问题描述】:

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

  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


    【解决方案1】:

    第一个问题来自Java List.add() UnsupportedOperationException ,它给你一个返回一个固定大小的列表,你需要把它包裹在一个ArrayList中,比如new ArrayList&lt;&gt;(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())));
    

    【讨论】:

    • 这很好,但是为什么双重迭代不起作用,我看到我将值反复放入地图的值字段中,不知何故迭代两次是我想到的第一个想法,你能解释错误的原因
    • @valik 您使用了students[col][1] 而不是students[row][1],并且当您为子数组的每个值 (2) 进行插入时,您将为所有值复制
    【解决方案2】:

    因为Arrays.asList(...)返回AbstractList的实现,导致了这个问题。

    试试这个更新的代码:

    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.containsKey(students[row][0])) {
                List<String> list = new ArrayList<>();
                list.add(students[col][1]);
                grades.put(students[row][0], list);
            } 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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-09-04
      • 2018-06-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多