有一个类似“ [[7], [2,2,3]]
”的字符串。
如何将该字符串转换为List<List<Integer>>
对象?
这是在JUnit5中实现参数转换器。
@CsvSource({
"'[2,3,6,7]', 7, '[[7], [2, 2, 3]]'"
})
我想将字符串“ [[7], [2,2,3]]
”转换为List<List<Integer>>
对象。
答案 0 :(得分:3)
尝试一下:
您在], [
处拆分了输入字符串,这将为您提供以下各行:
row[0]: [[7
row[1]: 2,2,3]]
然后您消除了'[['
']]'
字符串
row[0]: 7
row[1]: 2,2,3
然后遍历行元素,方法是在','
处进一步拆分行元素,并将每个元素添加到列表中。完成一行后,将其添加到listOfLists的列表中。
public List<List<Integer>> parseList(){
String s = "[[7], [2,2,3]]";
return Arrays.stream(s.split("], \\["))
.map(row -> row.replace("[[", "").replace("]]", ""))
.map(row -> Arrays.stream(row.split(","))
.map(Integer::parseInt).collect(Collectors.toList())
).collect(Collectors.toList());
}
答案 1 :(得分:1)
可以使用Java 8流API通过以下方式完成此操作:
Integer[][] dataSet = new Integer[][] {{...}, {...}, ...};
List<List<Integer> list = Arrays.stream(dataSet)
.map(Arrays::asList)
.collect(Collectors.toList());
答案 2 :(得分:1)
免责声明:我假设您要转换给定的int[][]
(或Integer[][]
)而不解析String
。
您可以为此使用常规的for循环或流API。
实际上有很多变体可以实现这一目标。
假设您的source
数组的类型为int[][]
:
List<List<Integer>> result = Arrays.stream(source) // Stream<int[]>
.map(Arrays::stream) // Stream<IntStream>
.map(IntStream::boxed) // Stream<Stream<Integer>>
.map(values -> values.collect(Collectors.toList()) // Stream<List<Integer>>
.collect(Collectors.toList()) // List<List<Integer>>
假设它的类型为Integer[][]
:
List<List<Integer>> result = Arrays.stream(source) // Stream<Integer[]>
.map(Arrays::stream) // Stream<Stream<Integer>>
.map(values -> values.collect(Collectors.toList()) // Stream<List<Integer>>
.collect(Collectors.toList()) // List<List<Integer>>
如果内部数组是不变的(如果您不能向其中添加或删除项目),您可以:
List<List<Integer>> result = Arrays.stream(source) // Stream<Integer[]>
.map(Arrays::asList) // Stream<List<Integer>>
.collect(Collectors.toList()) // List<List<Integer>>
这是常规增强型for循环的变体:
List<List<Integer>> result = new ArrayList<>(source.length);
for (int[] innerValues : source) {
List<Integer> values = new ArrayList<>(innerValues.length);
for (int value : innerValues) {
values.add(value);
}
result.add(values);
}
如果source
是Integer[][]
,只需在上面的代码中将int
替换为Integer
。
您也可以使用forEach
:
List<List<Integer>> result = new ArrayList<>(source.length);
for (int[] innerValues : source) {
List<Integer> values = new ArrayList<>(innerValues.length);
innerValues.forEach(values::add);
result.add(values);
}
或values = Arrays.asList(innerValues)
。但随后它们又变得不可变了。
答案 3 :(得分:1)
如果输入是字符串,则可以使用JSON库对其进行解析。
以下代码将字符串转换为期望的输出。
JSONArray obj = (JSONArray) new JSONObject("{ \"array\" : [[7],[2,2,3]] }").get("array");
List<Object> list = obj.toList();
List<ArrayList<Integer>> newList = new ArrayList<ArrayList<Integer>>();
list.forEach(item -> {
ArrayList<Integer> ar = (ArrayList<Integer>) item;
newList.add(ar);
});
System.out.println(newList);
答案 4 :(得分:0)
您可以使用以下方法将二维整数数组转换为List<List<Integer>>
:
private static List<List<Integer>> arrayToList(Integer[][] array) {
List<List<Integer>> lists = new ArrayList<>();
for (Integer[] a : array) {
List<Integer> list = new ArrayList<>();
list.addAll(Arrays.asList(a));
lists.add(list);
}
return lists;
}