元の(多次元)配列を返すパーサーを書きたくありません
double[][] returned = parse2D(Arrays.deepToString(new double[][]{{1,2}{3,4}}));
同様に、他のパーサーに依存するparse1D
method とmethod が必要です。parse3D
これをコーディングしているときに私が遭遇しているいくつかの問題があります。
Scanner
「[1」や「4]」などのトークンを提供しますScanner
usinguseDelimiter("[(\\s*,\\s*)]")
は多次元配列の構造を保持しません- 適切なグループをキャプチャするためのシングル
Pattern
を取得できないようですMatcher
- さらに、独自のパーサーを a に書くべきではありません
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...
これはとてもシンプルなはずです!この単純なことを機能させることができないのはなぜですか?! 自分でパーサーを書く必要がありますか? パーサー・コンビネーター・ライブラリーを取得する必要がありますか? 何をすべきか?