0

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

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

同样,我想要 methodparse1D和 method parse3D,这将取决于其他解析器。

我在编码时遇到了几个问题。

  • Scanner将给出诸如“[1”和“4]”之类的标记
  • ScannerusinguseDelimiter("[(\\s*,\\s*)]")不会保留多维数组的结构
  • 我似乎无法找到一个PatternMatcher捕获正确组的人
  • 此外,我不应该为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...

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

4

1 回答 1

0

这成功了:

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值。

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

于 2013-11-18T15:08:38.230 回答