如何在java中使用split制作二维arraylist?

如何在java中使用split制作二维arraylist?,java,arraylist,Java,Arraylist,字符串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\n” 这是我所期望的结果 00000 00000 00000 00000 00000 00000 00000 00000 00000 00000 我需要制作2Darraylist 我试过这个: String temp = s; String[] tempRow = temp.split("\n"); ArrayList<ArrayList&l

字符串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\n”

这是我所期望的结果

00000 00000 00000 00000 00000 00000 00000 00000 00000 00000 我需要制作2Darraylist

我试过这个:

    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);
    }
String temp=s;
字符串[]tempRow=temp.split(“\n”);
ArrayList mat=新的ArrayList();

对于(int i=0;i,您当前的方法有点不正确,相反,它应该如下所示:

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

您当前的方法有点不正确,相反,应该如下所示:

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);
}
解释 您的方法不起作用的原因是,您用
字符串表示数据,如:

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[][] data = parseData(input, outerDelimiter, innerDelimiter);

新一代推送接口 或者,您可以使用流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[][]
int[][]result=Arrays.stream(input.split(outerdelimitor))//stream
.map(line->Arrays.stream(line.split(innerDelimiter))//stream
.mapToInt(Integer::valueOf)//流
.toArray())//流
.toArray(int[]]::新建);//int[][]
说明 您的方法不起作用的原因是,您用
字符串表示数据,如:

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[][] data = parseData(input, outerDelimiter, innerDelimiter);

新一代推送接口 或者,您可以使用流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[][]
int[][]result=Arrays.stream(input.split(outerdelimitor))//stream
.map(line->Arrays.stream(line.split(innerDelimiter))//stream
.mapToInt(Integer::valueOf)//流
.toArray())//流
.toArray(int[]]::新建);//int[][]

我认为没有“方便”的方法。使用像你这样的循环可能是唯一/首选的方法。“不起作用”是什么意思?当某些东西不起作用时,要准确。创建一个,用示例展示问题,并添加完整的错误信息/描述。我认为没有“方便”的方法方法。使用像您这样的循环可能是唯一/首选的方法。“不起作用”是什么意思?当某些东西不起作用时要精确。创建一个实例,展示问题,并添加完整的错误消息/说明。@Vasan让我们假设您这样做了,并使用了(String str:s.split(“\n”)
)accumulator.add(Arrays.asList(str.split(“,”);
这将导致
[[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,0,0,0],[0,0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0]的结果因此,我使用内环来过滤空白元素。@ AOMIN对,错过了空的检查。@ VASAN让我们假设你这样做了,并与<代码>(String ST:S.S分裂(“\n”))累加器。添加(数组。Aslist(String S分裂(”,)));这将导致<代码> [[ 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]]
而不是
[[0,0,0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0]]这就是为什么我使用内环来过滤空白元素。AOMIN,对,空的检查。如果你不过滤掉空元素,这将产生<代码> java。Lang.No.BurbFrimeExt[/Cord]。@ Aomin是的。这是OP的要求吗?我忽略了。AOMIN现在看到问题了。调整答案,谢谢。这是DEF。这是对您之前描述的一个改进,尽管不确定当OP想要的只是一个
列表时,您在解析数据是什么?这可能是因为数据并不总是一个有效的整数,或者这只是他们想要的方式。然而,让我们不要假设并使用您当前将字符串解析为整数的方法,您的code仍然会失败,因为您试图将空字符串解析为整数,因此添加一个过滤器,例如
.filter(e->!e.isEmpty())内部流中的
应该足够了,命令式方法也足够了。@Aominè只是因为前导逗号。我在第一段中提到了这一点。真正的行分隔符是
\n、
,而不是
\n
。但是我认为输入不应该包含前导逗号。格式应该更改