如何将int [] []字符串转换为List <List <Integer >>

时间:2019-10-11 08:34:16

标签: java junit5

有一个类似“ [[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>>对象。

5 个答案:

答案 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);
}

如果sourceInteger[][],只需在上面的代码中将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;
}