【问题标题】:Java method to parse strings解析字符串的Java方法
【发布时间】:2016-07-19 17:40:52
【问题描述】:

我有一个像

这样的输入字符串
{{1,2},{3,4},{5,6}}.

我想将数字读入一个二维数组,比如

int[][] arr = {{1,2},{3,4},{5,6}}. 

有没有一种好方法可以将此 string 转换为 int[][] ?谢谢。

【问题讨论】:

标签: java string java.util.scanner


【解决方案1】:

基本思路如下,你将不得不自己添加错误处理代码和更多的逻辑计算数组大小。我只是想展示如何拆分字符串并制作int [][]array。

    String test = "{{1,2},{3,4},{5,6}}"; 

    test = test.replace("{", "");
    test = test.replace("}", "");

    String []nums = test.split(",");
    int numIter = 0;

    int outerlength = nums.length/2;

    int [][]array = new int[outerlength][];

    for(int i=0; i<outerlength; i++){
        array[i] = new int[2]; 
        for(int j=0;j<2;j++){
            array[i][j] = Integer.parseInt(nums[numIter++]);
        }
    }

希望对你有帮助!

【讨论】:

  • 感谢 Mrunal Pagnis
【解决方案2】:

我会使用动态存储(例如 Collections 中的 List)寻求解决方案,然后在最后将其转换为固定的原始数组。

public static void main(String[] args) throws Exception {
    System.out.println(Arrays.deepToString(parse("{{1,2},{3,4},{5,6}}")));
}

private static int[][] parse(String input) {
    List<List<Integer>> output = new ArrayList<>();
    List<Integer> destination = null;

    Pattern pattern = Pattern.compile("[0-9]+|\\{|\\}");
    Matcher matcher = pattern.matcher(input);
    int level = 0;

    while (matcher.find()) {
        String token = matcher.group();
        if ("{".equals(token)) {
            if (level == 1) {
                destination = new ArrayList<Integer>();
                output.add(destination);
            }
            level++;
        } else if ("}".equals(token)) {
            level--;
        } else {
            destination.add(Integer.parseInt(token));
        }
    }
    int[][] array = new int[output.size()][];
    for (int i = 0; i < output.size(); i++) {
        List<Integer> each = output.get(i);
        array[i] = new int[each.size()];
        for (int k = 0; k < each.size(); k++) {
            array[i][k] = each.get(k);
        }
    }
    return array;
}

另一种选择是将{ 转换为[ 并将} 转换为],然后您就有了JSON,只需使用您最喜欢的JSON 解析器,这里我使用了GSON。

private static int[][] parse(String string) {
    JsonElement element = new JsonParser().parse(string.replace("{", "[").replace("}", "]"));
    JsonArray  obj = element.getAsJsonArray();
    int [][] output = new int[obj.size()][];
    for (int i = 0; i < obj.size(); i++) {
        JsonArray each = obj.get(i).getAsJsonArray();
        output[i] = new int[each.size()];
        for (int k = 0; k < each.size(); k++) {
            output[i][k] = each.get(k).getAsInt();
        }
    }
    return output;
}

【讨论】:

  • 谢谢亚当。您提出的第一个解决方案不适用于{{1,44},{3,4},{5,6}} 之类的输入数组
  • @geekintown 修复了用户模式而不是扫描仪的答案,事后看来,要么尝试使用分隔符......它只匹配单个字符
猜你喜欢
  • 1970-01-01
  • 2013-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-22
  • 2011-01-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多