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?
答案 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:
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[][]