繁体   English   中英

如何将字符串转换为嵌套数组

[英]How to turn a String into a nested Array

我得到一个格式为<num-num-num><num-num-num><num-num-num>的字符串。 我想把它变成一个嵌套的整数数组,每个数组都是<>之间的内容。

这是我到目前为止得到的:

String parameter = args[1];
// split the string into an array of strings at >

String[] splitString = parameter.split(">");
int[][] square = new int[splitString.length][splitString.length];

// remove <, > and - characters and push the numbers into the square

for (int i = 0; i < splitString.length; i++) {
    splitString[i] = splitString[i].replaceAll("[<>-]", "");

    for (int j = 0; j < splitString.length; j++) {
        square[i][j] = Integer.parseInt(splitString[i].substring(j, j + 1));
    }
}

我觉得这不是很干净,但它确实有效。 有没有人知道如何提高可读性?

我假设"<num-num-num><num-num-num><num-num-num>"会定义一个 3x3 网格,所以我会使用以下方法:

  • 将字符串拆分为每行一个字符串,以便我们得到"num-num-num" 这意味着:
    • 删除前导和尾随 angular 括号
    • "><"处拆分并将其删除
  • "-"处拆分每一行以获得单独的数字
  • 解析数字并将它们分配给网格

一些代码示例:

String input = "<11-12-13><21-22-23><31-32-33>";
 
//remove leading < and trailing > then split at ><   
String[] inputRows = input.substring(1,input.length()-1).split("><");
    
int[][] grid = new int[inputRows.length][];
    
for( int r = 0; r < inputRows.length; r++) {
    //split the row at -
    String[] cells = inputRows[r].split("-");
        
    //convert the array of strings to an array of int by parsing each cell
    grid[r] = Arrays.stream(cells).mapToInt(Integer::parseInt).toArray();
}

以下是如何使用 Java 9 Matcher.results()来完成。

首先,让我们定义一个模式来捕获一组用破折号-交织的数字:

public static final Pattern ANGLE_BRACKETS = Pattern.compile("<([\\d-]*)>");

使用此模式,我们可以创建一个匹配器,并使用Matcher.results()生成一个 stream 的MatchResult s,这是一个 object 表示捕获的字符序列。

我们可以使用MatchResult.group()获得匹配的 substring( 1应该作为参数传递,因为我们需要不带括号的 substring )。

要拆分每个组,我们可以使用Pattern.splitAsStream()Arrays.split() 在这种情况下,后者是首选,因为无需编译正则表达式和使用正则表达式引擎即可在破折号"-"上拆分字符串。 当数组很大时, Pattern.splitAsStream()可能更有益( splitAsStream()直接从需要分配中间数组的正则表达式引擎生成 stream),或者我们需要使用正则表达式而不是常规字符串来拆分字符串像"-"

String parameter = "<1-2-3><4-5-6><7-8-9>";
    
int[][] matrix = ANGLE_BRACKETS1.matcher(parameter).results()
    .map(matchResult -> matchResult.group(1))
    .map(str -> Arrays.stream(str.split("-")).mapToInt(Integer::parseInt).toArray())
    .toArray(int[][]::new);
    
System.out.println(Arrays.deepToString(matrix));

Output:

[[1, 2, 3], [4, 5, 6], [7, 8, 9]]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM