从字符串初始化Java int 2d数组



我有一个简单的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解析输入流:

  1. 在一对},{
  2. 之间以逗号分隔行
  3. 使用String::replaceAll
  4. 删除多余的花括号
  5. 对于每一行,用逗号分隔,将数字转换为整数Stream::mapToInt并获得数组
  6. collection to multidimensional array withStream::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解析器解析它,这将使它更容易和更干净。

相关内容

  • 没有找到相关文章

最新更新