我有一个简单的2d数组
// Creating and Initializing 2D array
int a[][] = {{0,1},{2,3},{4,5}};
for(int i=0; i<3; i++) {
for(int j=0; j<2; j++) {
System.out.print(a[i][j]+" ");
}
System.out.println();
}
一切正常。但是,当内容是动态的并且来自变量时,我如何初始化数组呢?
String arrContent = "{{0,1},{2,3},{4,5}}"; //actually a method readContentFromFile(); will deliver the content
int a[][] = arrContent;
有什么办法可以做到吗?
可以使用String::split
和流API解析输入流:
- 在一对
},{
之间以逗号分隔行 - 使用
String::replaceAll
删除多余的花括号 - 对于每一行,用逗号分隔,将数字转换为整数
Stream::mapToInt
并获得数组 - collection to multidimensional array with
Stream::toArray
String arrContent = "{{0,1},{2,3},{4,5}}";
int[][] arr = Arrays.stream(arrContent.split("\}\s*,\s*\{")) //1
.map(s -> s.replaceAll("[{}]", "")) //2
.map(s -> Arrays.stream(s.split("\s*,\s*")) //3
.mapToInt(Integer::parseInt).toArray()
)
.toArray(int[][]::new); //4
System.out.println(Arrays.deepToString(arr));
输出[[0, 1], [2, 3], [4, 5]]
另一种方法可以是使用JSON解析器,然而,初始输入字符串需要修改成为一个有效的JSON数组(花括号{}
必须替换为方括号[]
,使用更简单的String::replace(char old, char rep)
):
String arrContent = "{{0,1},{2,3},{4,5}}";
ObjectMapper om = new ObjectMapper();
int[][] arr = om.readValue(
arrContent.replace('{', '[')
.replace('}', ']'),
int[][].class);
System.out.println(Arrays.deepToString(arr));
// output
[[0, 1], [2, 3], [4, 5]]
只是想使用简单的regexp提供一点修改的解决方案,以防有人更喜欢这样做:
String input = "{{0,1},{2,3},{4,5}}";
Pattern pattern = Pattern.compile("\{[0-9,]+}");
int[][] array = pattern.matcher(input).results()
.map(matchResult -> matchResult.group().replaceAll("[{}]", ""))
.map(numberAsText -> Arrays.stream(numberAsText.split(",")).mapToInt(Integer::parseInt).toArray())
.toArray(int[][]::new);
就像其他人指出的那样-如果你有可能改变输入的形状-我也会建议使用JSON的数组并使用JSON解析器解析它,这将使它更容易和更干净。