将字符串转换为double [] [] - Java

时间:2016-07-05 08:50:47

标签: java arrays string list double

自Java doesn't have an eval() module以来,我想编写自己的正则表达式来将字符串解析为double[][],例如。

[in]:

`{{1.23,8.4},{92.12,-0.57212}}`
`{{1.23,-8.4}, {-92.12,-0.57212}}`

[代码]:

 double[][] xArr;
 // Somehow read the string into something like this:
 xArr = new double[][] {{1.23,8.4},{92.12,-0.57212}};
 System.out.println(xArr[0][0] + " " + xArr[0][1]);

[OUT]:

 1.23 -8.4

目前,我这样做:

import java.util.regex.Matcher;
import java.util.regex.Pattern;

import java.util.ArrayList;
import java.util.List;

public class HelloWorld {

    public static void main(String[] args) {
        String s = "{{1.23,8.4}, {92.12,-0.57212}}";

        Pattern regex = Pattern.compile("((-)?\\d+(?:\\.\\d+)?)");
        Matcher matcher = regex.matcher(s);
        List<double[]> locations = new ArrayList<double[]>();
        int i = 0;
        while(matcher.find()){
            double d1 = Double.parseDouble(matcher.group(1));
            matcher.find();
            double d2 = Double.parseDouble(matcher.group(1));
            locations.add(new double[] {d1, d2});
            i++;        
        }; 


    }

}

有更好的方法吗?即:

  • 现在,通过知道double [] []的内部大小为2并且在迭代match.find()期间,代码有点作弊。它通过2次跳转到下一对,是否有办法更改正则表达式,以便一次提取2个组?

  • 目前,在创建新的d1并添加到d2之前,它正在阅读double[]List变量,是有没有办法直接创建d1d2

3 个答案:

答案 0 :(得分:6)

使用jackson但你必须用方框/括号替换大括号。

使用此功能,您无需指定预期数组的尺寸

public static void main(String[] args) throws IOException {
    String jsonString = "{{1.23,8.4}, {92.12,-0.57212}}";
    jsonString = jsonString.replace("{", "[").replace("}", "]");
    Double[][] doubles = new ObjectMapper().readValue(jsonString, Double[][].class);
    System.out.println(Arrays.deepToString(doubles));
}

答案 1 :(得分:4)

这是我提出的Java 8解决方案:

args.map(entry => s""""${entry}"""" ).mkString(",")

输出:

String test = "{{1.23,8.4},{92.12,-0.57212}}";

double[][] vals = Arrays.stream(test.replaceAll(" ", "").split("},\\{"))
                        .map(str -> str.replaceAll("[{}]", "").split(","))
                        .map(Arrays::stream)
                        .map(stream -> stream.mapToDouble(Double::parseDouble)
                                             .toArray())
                        .toArray(double[][]::new);

System.out.println(Arrays.deepToString(vals));

或者如果你想要[[1.23, 8.4], [92.12, -0.57212]]

Double[][]

说明:

首先删除任何空格,并在模式Double[][] vals = Arrays.stream(test.replaceAll(" ", "").split("},\\{")) .map(str -> str.replaceAll("[{}]", "").split(",")) .map(Arrays::stream) .map(stream -> stream.map(Double::parseDouble) .toArray(Double[]::new)) .toArray(Double[][]::new); 上拆分字符串,这将产生},\\{,其中每个String[]都是String之一多余的花括号:

double[]

然后,对于每个["{{1.23,8.4", "92.12,-0.57212}}"] ,删除花括号,然后再次分割String。因此,每个String变为String,其中每个值都是&{34; String[]&#34; {/ p>的String表示形式

double

然后将这些字符串解析为双精度数据,并将所有内容收集到[["1.23", "8.4"],["92.12", "-0.57212"]] 然后收集到double[]

double[][]

答案 2 :(得分:0)

  1. 问题:
      

    有没有办法改变正则表达式,使其一次提取2个组

  2. 是。您可以使用现有模式从一个模式中提取整行。您必须添加paranthesis和komma以及+运算符(对于多个值)。 如果只有一行,则可以使用当前模式提取值,直到找不到(使用while循环)。

    1. 问题:
        

      有没有办法在不创建d1和d2的情况下直接进行?

    2. 我不确切地知道你的意思。创建它们的问题在哪里?使用问题1中建议的方法,您可以将每个值直接存储在列表中,然后从中创建一个数组。

      如果您的格式不改变,我也喜欢Olayinka的解决方案。