将Java字符串拆分为Double[]

4

我有一个字符串:

((39.4189453125 37.418708616699824,42.0556640625 37.418708616699824,43.4619140625 34.79181436843146,38.84765625 33.84817790215085,39.4189453125 37.418708616699824))

我想将它转换为 Double [] java 数组。

我尝试过:

String[]tokens = myString.split(" |,");
Arrays.asList(tokens).stream().map(item -> Double.parseDouble(item)).collect(Collectors.toList()).toArray();

除了数组列表数组转换之外,是否有更好更有效的方法?


3
您不需要将它们收集到列表中。您可以使用 toArray(Double[]::new) 直接从流转换为数组。 - khelwood
另外,如果你需要使用Double而不是double,你可以使用Double.valueOf代替Double.parseDouble - khelwood
避免使用浪费大量内存且速度较慢的Double - Has QUIT--Anony-Mousse
@EladBenda2 如果你使用 mapToDouble(Double::parseDouble),你将得到一个 DoubleStream - khelwood
@KlitosKyriacou 是的,我正在调用一个 double[] 签名,但我很想看看您如何使拆分返回 double[][2] - Elad Benda2
显示剩余3条评论
3个回答

15
Pattern pattern = Pattern.compile("-|\\.");

pattern.splitAsStream(test) // your String
       .map(Double::parseDouble)
       .toArray(Double[]::new);

此外,您的模式看起来很奇怪,似乎这个更适合 [-,\\s]+


2
@BoristheSpider,我更喜欢Java 9中的Scanner.findAll - Eugene
2
Double::valueOf 是否比 Double.parseDouble 更好?因为后者返回需要自动装箱的 double - khelwood
3
“@khelwood meh - boxed here or boxed there; don't make much difference.” 的意思是“在这里或那里封箱子没有太大区别。” - Boris the Spider
1
我仍然不确定这个答案是否有效,基于给定的模式和OP的示例输入。 - Klitos Kyriacou
@KlitosKyriacou 是的,pattern(模式)非常奇怪。 - Boris the Spider
显示剩余5条评论

4

以下是使用 doubles 而不是 Doubles 的方法。

String string = "1 2 3 4";
Pattern pattern = Pattern.compile(" |,");

double[] results = pattern.splitAsStream(string)
                          .mapToDouble(Double::parseDouble)
                          .toArray();

1
您的输入数据似乎是一系列数字对,因此以下是如何获得一个double[][2]数组。
public static void main(String[] args) {
    final String data = "(("
            + "39.4189453125 37.418708616699824,"
            + "42.0556640625 37.418708616699824,"
            + "43.4619140625 34.79181436843146,"
            + "38.84765625   33.84817790215085,"
            + "39.4189453125 37.418708616699824"
            + "))";

    final Pattern topLevelPattern = Pattern.compile("\\(\\((.*)\\)\\)");
    final Pattern pairSeparator = Pattern.compile(",");

    Matcher topLevelMatcher = topLevelPattern.matcher(data);
    if (!topLevelMatcher.matches())
        throw new IllegalArgumentException("Data not surrounded by double parentheses");

    String topLevelData = topLevelMatcher.group(1);  // whatever's inside the parentheses

    double[][] pairsArray = pairSeparator.splitAsStream(topLevelData)
            .map(s -> s.split("\\s+"))  // array[2] of strings representing doubles
            .map(a -> new double[]{Double.parseDouble(a[0]), Double.parseDouble(a[1])})
            .toArray(double[][]::new);

    for (double[] pair : pairsArray)
        System.out.println(Arrays.toString(pair));
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接