首页 > 解决方案 > 从字符串初始化java int 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;

有没有办法做到这一点?

标签: javaarraysmultidimensional-array

解决方案


可以使用String::splitStream API 解析输入流:

  1. 获取在一对之间用逗号分隔的行},{
  2. 使用删除多余的大括号String::replaceAll
  3. 对于每一行,用逗号分隔,将数字转换为 intStream::mapToInt并获取数组
  4. 收集到多维数组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]]

推荐阅读