遍历二维数组并将值放入映射 [重复]
Posted
技术标签:
【中文标题】遍历二维数组并将值放入映射 [重复]【英文标题】: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";
我想将此记录保存在地图中,其中值是一个学生的成绩列表
谢谢
【问题讨论】:
【参考方案1】:第一个问题来自Java List.add() UnsupportedOperationException
,它给你一个返回一个固定大小的列表,你需要把它包裹在一个ArrayList
中,比如new 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())));
【讨论】:
这很好,但是为什么双重迭代不起作用,我看到我将值反复放入地图的值字段中,不知何故迭代两次是我想到的第一个想法,你能解释错误的原因 @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;
【讨论】:
以上是关于遍历二维数组并将值放入映射 [重复]的主要内容,如果未能解决你的问题,请参考以下文章