[英]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(.)
因为我想允许NaN
和POSITIVE_INFINITY
值。
多维数组解析可以进行优化,因为在第一个数组之后,我们知道其他数组的长度。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.