簡體   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