【问题标题】:Converting a string into a double[][] - Java将字符串转换为 double[][] - Java
【发布时间】:2016-07-05 08:50:46
【问题描述】:

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

[输入]:

`{{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]);

[出]:

 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 个组?

  • 目前它正在读取d1d2 变量,然后再创建一个新的double[] 添加到List有没有办法直接做到这一点而不创建d1d2?

【问题讨论】:

  • 如果您不关心性能,您可以使用 Java 中的 Javascript 引擎,例如:stackoverflow.com/a/2605051/2947592
  • @wvdz,如何将生成的Object 转换为double[][]
  • 如何使用matcher.groupCount() 查找双精度数组的大小?
  • 您可以将其转换为NativeArray,然后手动将其转换为double[][]。我认为这不是最好的方法,但如果您只需要快速修复,那么修复您的正则表达式可能会更容易。我认为使用正则表达式更好。

标签: java arrays string list double


【解决方案1】:

使用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));
}

【讨论】:

    【解决方案2】:

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

    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 变成一个String[],其中每个值都是String 表示“double”:

    [["1.23", "8.4"],["92.12", "-0.57212"]]
    

    然后将这些字符串解析为双精度,并将所有内容收集到double[],然后是double[][]

    [[1.23, 8.4], [92.12, -0.57212]]
    

    【讨论】:

    • 我收到了error: incompatible types: String cannot be converted to double[][] Arrays.deepToString(vals)
    • @alvas 你的代码和我的帖子一模一样吗?因为我已经测试过它并且它有效。
    • 在进行转换之前我有Double[][] vals;。这是一个在我的代码中声明的变量。
    • 啊,我知道了,我有double[][] locationArray = Arrays.deepToString(vals); 我如何从Double[][]double[][]
    • 谢谢!!啊,我可以在最后一次转换流中更改类型 =)
    【解决方案3】:
    1. 问题:

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

    是的。您可以使用现有的模式提取具有一种模式的整行。您必须添加括号和 komma 以及 + 运算符(对于多个值)。 当您只有一行时,您可以使用当前模式提取值,直到找不到更多值(使用 while 循环)。

    1. 问题:

      有没有办法不创建 d1 和 d2 直接做呢?

    我不明白你的意思。创建它们的问题在哪里?使用问题 1 的建议方式,您也可以将每个值直接存储在列表中,然后从中创建一个数组。

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

    【讨论】:

      猜你喜欢
      • 2018-07-13
      • 2011-06-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多