繁体   English   中英

解析(多维)数组Java

[英]Parsing (multidimensional) arrays Java

我不会写一个解析器来返回原始的(多维)数组

double[][] returned = parse2D(Arrays.deepToString(new double[][]{{1,2}{3,4}}));

类似地,我需要方法parse1D和方法parse3D ,它们将依赖于其他解析器。

在编写此代码时,我遇到了几个问题。

  • Scanner会给出令牌,例如“ [1”和“ 4””
  • 使用useDelimiter("[(\\\\s*,\\\\s*)]") Scanner不会保留多维数组的结构
  • 我似乎无法获得一个Pattern来让Matcher捕获正确的组
  • 而且,我不应该为double编写自己的解析器。

下面的代码我已经呕吐(写出)了一些作品,但也接受了诸如"random crap before actual array [1]"类的字符串。

public static Tuple<Matcher, double[]> parse1D(String input) {
    Pattern left = Pattern.compile("\\[");
    Pattern right = Pattern.compile("\\]");
    Pattern comma = Pattern.compile(",\\s*");
    Pattern num = Pattern.compile("[[0-9]+E\\.\\-]+");

    Matcher matcher = left.matcher(input);
    matcher.find();
    List<Double> l = new ArrayList<Double>();
    matcher.usePattern(num);
    while (matcher.find()) {
        MatchResult result = matcher.toMatchResult();
        l.add(Double.parseDouble(result.group()));
        matcher.usePattern(comma);
        matcher.find();
        matcher.usePattern(num);
    }
    double[] ret = new double[l.size()];
    int x = 0;
    for (double d : l) {
        ret[x] = d; x++;
    }
    return new Tuple<Matcher, double[]>(matcher, ret);
} // the matcher is also returned to be used by parse2D...

这应该很简单! 为什么我不能让这个简单的东西起作用? 我应该自己写一个解析器吗? 我应该得到一些解析器组合库吗? 该怎么办?

这达到了目的:

import java.io.IOException;
import java.util.ArrayList;
import javax.json.stream.JsonParser;

public class JSONtry {

private static double[] parse1D(JsonParser parser) throws IOException {
    ArrayList<Double> l = new ArrayList<Double>();

    outerLoop:
        while (parser.hasNext()) {
           JsonParser.Event event = parser.next();
           switch(event) {
              case START_ARRAY: break;
              case END_ARRAY:
                  break outerLoop;
              case VALUE_STRING:
                  l.add(Double.parseDouble(parser.getString()));
                 break;
              default:
                  throw new IOException("Not a 1 dimensional array! Seeing: "+event.toString());
           }
        }
    double[] ret = new double[l.size()];
    for (int i = 0; i<l.size(); i++)
        ret[i] = l.get(i);
    return ret;
}
private static double[][] parse2D(JsonParser parser) throws IOException {
    ArrayList<double[]> l = new ArrayList<double[]>();

    outerLoop:
        while (parser.hasNext()) {
            JsonParser.Event event = parser.next();
            switch(event) {
            case START_ARRAY:
                l.add(parse1D(parser)); 
                break;
            case END_ARRAY:
                break outerLoop;
            default:
                throw new IOException("Not a 2 dimensional array! Seeing: "+event.toString());
            }
        }
    double[][] ret = new double[l.size()][l.get(0).length];
    for (int i = 0; i<l.size(); i++)
        ret[i] = l.get(i);
    return ret;
}
}

顺便说一句:我要使用getString(.)而不是getInt(.)getBigDecimal(.)因为我想允许NaNPOSITIVE_INFINITY值。

多维数组解析可以进行优化,因为在第一个数组之后,我们知道其他数组的长度。

暂无
暂无

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

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