2013-11-14 43 views
0

我wan't寫一個解析器將返回原始(多維)陣列用於解析(多維)陣列的Java

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

類似地,我希望的方法parse1D,並且所述方法parse3D,這將取決於其他解析器。

在編碼時遇到了幾個問題。

  • Scanner會給令牌如「[1」和「4]」
  • Scanner使用useDelimiter("[(\\s*,\\s*)]")不會保留多維數組的結構
  • 我似乎無法得到一個單一的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... 

這應該是如此簡單!爲什麼我不能得到這個簡單的東西工作? 我應該自己寫一個解析器嗎?我應該得到一些解析器 - 組合器庫嗎? 怎麼辦?

+1

你在用什麼解析?有沒有一個原因,你不能只是序列化成JSON,然後退出? –

+0

@ericBarr我目前仍在學習JSON。它似乎爲我提供了必要的設備。我現在正在用'javax.json.stream'嘗試它,但我遇到了一些問題。感謝您的建議。 –

回答

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

對於多維數組解析,優化是可能的,因爲在第一個數組之後,我們知道其他數組的長度是多少。