我有一个由定义的列表的动态列表
List<List<String>> listOfLists = new ArrayList<List<String>>();
类似:
[[A, B, C, D], [E, F, G, H]]
在这个例子中,它有2组,每组4个项目,但它可以动态地有1组到n组。
现在,我需要一个2维字符串,所以类似于:
String[][] data ={{"A", "B", "C", "D"}, {"E", "F", "G", "H"}}
有没有一种方法可以很容易地转换它?如果没有,我如何动态创建二维String
,其中我知道列数而不知道行数?
使用流尝试这样做。它对列表进行流式处理,并将每个内部列表转换为一个数组,然后将这两个数组转换为数组的数组。
List<List<String>> list = List.of(
List.of("A", "B", "C", "D"),
List.of("E", "F", "G", "H"));
String[][] arr = list.stream()
.map(lst->lst.stream()
.toArray(String[]::new))
.toArray(String[][]::new);
System.out.println(Arrays.deepToString(arr));
打印
[[A, B, C, D], [E, F, G, H]]
你也可以这样做。
String[][] arr = new String[list.size()][];
for (int i = 0; i < list.size(); i++) {
arr[i] = list.get(i).toArray(new String[0]);
}
我的建议
private String[][] toMatrix(List<List<String>> listOfLists) {
int size = listOfLists.size();
String[][] result = new String[size][];
for (int i = 0; i < size; i++) {
List<String> list = listOfLists.get(i);
result[i] = new String[list.size()];
for (int j = 0; j < list.size(); j++) {
result[i][j] = list.get(j);
}
}
return result;
}
这应该有效:
private static String[][] convert(List<List<String>> listOfLists) {
var result = new String[listOfLists.size()][];
var i = 0;
for (var list : listOfLists) {
result[i] = new String[list.size()];
var j = 0;
for (var elem : list) {
result[i][j] = elem;
j++;
}
i++;
}
return result;
}