如何在java中使用split进行二维arraylist?

时间:2018-05-28 16:46:02

标签: java arraylist

String s =“0,0,0,0,0 \ n,0,0,0,0,0 \ n,0,0,0,0,0 \ n,0,0,0,0 ,0 \ N,0,0,0,0,0 \ n“个;

这是我期望的结果。

00000
00000
00000
00000
00000

我需要制作2D arraylist

我试过了:

    String temp = s;
    String[] tempRow = temp.split("\n");

    ArrayList<ArrayList<String>> mat = new ArrayList<ArrayList<String>>();

    for(int i = 0; i<tempRow.length; i++){
        ArrayList<String> row = new ArrayList<String>(tempRow.length);
        String[] a = s.split(",");

        String[] b = a[i].split("\n");
        for (int j = 0; j<tempRow.length;j++){
            row.add(a[i]);
        }
        mat.add(row);
    }

但分裂“,”不起作用。

有没有正确的方法来制作二维arraylist?

2 个答案:

答案 0 :(得分:1)

您当前的方法有点偏离,相反,它应该如下:

List<List<String>> accumulator = new ArrayList<>();
for (String str : s.split("\n")) {
    List<String> tempList = new ArrayList<>();
    for (String e : str.split(","))
        if (!e.isEmpty())
            tempList.add(e);
    accumulator.add(tempList);
}

或使用流API,可以使用:

List<List<String>> result = Pattern.compile("\n")
                .splitAsStream(s)
                .map(e -> Arrays.stream(e.split(","))
                           .filter(a -> !a.isEmpty()).collect(toList()))
                .collect(toList());

后一种解决方案需要以下导入:

import static java.util.stream.Collectors.*;

答案 1 :(得分:1)

说明

您的方法不起作用的原因是因为您在String中表示您的数据,如:

0,0,0,0,0\n
,0,0,0,0,0\n
,0,0,0,0,0\n
,0,0,0,0,0\n
,0,0,0,0,0

请注意引导逗号。但是在您的代码中,您会在\n上拆分,而实际的正确行分隔符为\n,。按\n,拆分或从数据格式中删除前导逗号:

0,0,0,0,0\n
0,0,0,0,0\n
0,0,0,0,0\n
0,0,0,0,0\n
0,0,0,0,0

此外,您首先按,分割,然后按\n分割。但这是错误的方式。您想首先拆分所有行,然后拆分这些行中的条目。否则你得到

["0", "0", "0", "0", "0\n", "0", "0", "0", "0", "0\n", ...]

第一次拆分然后

[
    ["0"],
    ["0"],
    ["0"],
    ["0"],
    ["0"],
    ["0"],
    ...
]

进行第二次拆分。通过分开反过来修复它。第一行:

["0,0,0,0,0", "0,0,0,0,0", ...]

然后是条目:

[
    ["0", "0", "0", "0", "0"],
    ["0", "0", "0", "0", "0"],
    ...
]

解析

Java没有内置方法来执行此操作。你应该像你已经做的那样接近这个。也就是说,通过手动拆分,迭代和收集:

String outerDelimiter = "\n";
String innerDelimiter = ",";
String input = ...

List<List<Integer>> result = new ArrayList<>();

for (String line : input.split(outerDelimiter)) {
    List<Integer> lineData = new ArrayList<>();
    for (String data : line.split(innerDelimiter)) {
        lineData.add(Integer.valueOf(data));
    }
    result.add(lineData);
}

或者如果你想要int[][]

List<int[]> resultList = new ArrayList<>();

for (String line : input.split(outerDelimiter)) {
    String[] lineDataText = line.split(innerDelimiter);
    int[] lineData = new int[lineDataText.length];
    for (int i = 0; i < lineDataText.length; i++) {
        lineData[i] = Integer.valueOf(lineDataText[i]);
    }
    result.add(lineData);
}

int[][] result = resultList.toArray(new int[resultList.size()][]);

将其打包在实用程序方法中并且使用起来很舒服:

int[][] data = parseData(input, outerDelimiter, innerDelimiter);

Stream API

或者您可以使用Stream API:

int[][] result = Arrays.stream(input.split(outerDelimiter))  // Stream<String>
    .map(line -> Arrays.stream(line.split(innerDelimiter))   // Stream<String[]>
        .mapToInt(Integer::valueOf)                          // Stream<IntStream>
        .toArray())                                          // Stream<int[]>
    .toArray(int[][]::new);                                  // int[][]