[英]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.