如何在java中使用split制作二维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 我试过这个:如何在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
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
。但是我认为输入不应该包含前导逗号。格式应该更改