【问题标题】:initialize java int 2d array from string从字符串初始化java int 2d数组
【发布时间】:2021-09-21 09:32:15
【问题描述】:

我有一个简单的二维数组

// 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,这是不可能的,这在这种情况下相当复杂。如果您有可能将文件的内容更改为 json,则使用 json 解析器将是最快的解决方案。

标签: java arrays multidimensional-array


【解决方案1】:

输入流可以使用String::split和Stream API解析:

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

【讨论】:

    【解决方案2】:

    只是想使用简单的正则表达式提供一些修改后的解决方案,以防万一有人更喜欢这样做:

    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 解析器对其进行解析,这将使其更容易和更干净。

    【讨论】:

      猜你喜欢
      • 2022-07-23
      • 1970-01-01
      • 2014-08-23
      • 1970-01-01
      • 1970-01-01
      • 2018-07-31
      • 2011-12-11
      • 1970-01-01
      相关资源
      最近更新 更多