2013-11-14 41 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值。

对于多维数组解析,优化是可能的,因为在第一个数组之后,我们知道其他数组的长度是多少。