将字符串值转换为双精度类型的二维数组

4

我有一个字符串:

String stringProfile = "0,4.28 10,4.93 20,3.75";

我正在尝试将其转换为以下格式的数组:
double [][] values = {{0, 4.28}, {10, 4.93}, {20, 3.75}};

我已经将字符串格式化,去除了任何空格并用逗号替换:
String stringProfileFormatted = stringProfile.replaceAll(" ", ",");

现在有一个字符串 stringProfileFormatted = "0,4.28,10,4.93,20,3.75";

然后我创建了一个字符串数组:

String[] array = stringProfileFormatted.split("(?<!\\G\\d+),");

对于数组中的每个元素,都有两个逗号的字符串。

不确定如何将其转换为二维数组。这是否是正确的方法?


你能具体说明你是指多维数组还是二维数组吗?你的例子是二维的,我猜你对二维数组感兴趣 - 请纠正以避免混淆。此外,您还有其他有用的提示或假设吗?矩阵是否会受到最大维度的限制(限制应该是合理的)? - Ely
抱歉,是的,它是一个二维数组。2D数组中的每个数组都有固定的长度为2。就像示例所示的一样,它将是成对出现的。 - arsenal88
如果您的字符串严格遵循输入中显示的模式,即由逗号分隔的两个值对,并且每个这样的对都由空格分隔 - 那么解决这个问题就很简单了,只需通过\s+拆分字符串,然后在那些已拆分的字符串中拆分每个字符串,使用Double.valueOf(string)获取double,创建一个新的1d数组并将其插入到您的2d数组中。不确定是否还有更复杂的情况。 - SomeDude
5个回答

7

我会逐步解决这个任务。

首先,我会通过空格分割原始的 String,然后再通过逗号分割结果,并最终使用 Double.parseDouble(String value) 将这些值创建为 double 数组。

public static void main(String[] args) {
    String stringProfile = "0,4.28 10,4.93 20,3.75";

    // split it once by space
    String[] parts = stringProfile.split(" ");

    // create some result array with the amount of double pairs as its dimension
    double[][] results = new double[parts.length][];

    // iterate over the result of the first splitting
    for (int i = 0; i < parts.length; i++) {
        // split each one again, this time by comma
        String[] values = parts[i].split(",");

        // create two doubles out of the single Strings
        double a = Double.parseDouble(values[0]);
        double b = Double.parseDouble(values[1]);

        // add them to an array
        double[] value = {a, b};

        // add the array to the array of arrays
        results[i] = value;
    }

    // then print the result
    for (double[] pair : results) {
        System.out.println(String.format("%.0f and %.2f", pair[0], pair[1]));
    }
}

是的,这些代码行数很多,但比起Lambda表达式来说更容易理解(在我看来Lambda表达式更酷、更优雅)。


1
我会将print更改为System.out.println(String.format("%.0f and %.2f", pair[0], pair[1]));以获得更好的格式。它会打印小数点后不必要的数字。 - nabster
这里使用 0 和 4.28 代替 0.000000 和 4.280000 - nabster

5
这样怎么样呢:
Arrays.stream("0,4.28 10,4.93 20,3.75".split(" ")) //Stream<String>
     .map(s -> 
           Arrays.stream(s.split(",")) // take an individual string like 0,4.28  
                 .map(Double::parseDouble) // and transform it to a double array
                 .toArray(Double[]::new)
      )
     .toArray(Double[][]::new);

结果是

$8 ==> Double[3][] { 
        Double[2] { 0.0, 4.28 }, 
        Double[2] { 10.0, 4.93 }, 
        Double[2] { 20.0, 3.75 } 
}

2
我只是在等待有人使用流一行代码解决问题。 :) - SomeDude

2
如果您的字符串符合您所描述的模式,则可以按照以下方式执行:

代码示例:

String stringProfile = "0,4.28 10,4.93 20,3.75";
String[] split = stringProfile.split(" "); // split by space;

double[][] a = new double[split.length][]; // your result

for(int i = 0; i < split.length; i++) {
    String[] numbers = split[i].split(","); // split by ,
    double[] doubles = Arrays.stream(numbers).mapToDouble(Double::new).toArray(); //create 1-D array
    a[i] = doubles; // assign it do your result
}

0
假设您的字符串严格遵循给定的样本模式,您可以使用以下代码:
    String stringProfile = "0,4.28 10,4.93 20,3.75";
    stringProfile = stringProfile.replace(' ', ',');
    String [] strArry = stringProfile.split(",");
    double [][] doubleArray = new double [strArry.length/2][2];
    for(int i=0, j=0; i<strArry.length; i=i+2, j++) {
        doubleArray [j][0] = Double.valueOf(strArry[i]);
        doubleArray [j][1] = Double.valueOf(strArry[i+1]);
    }

-1
如果你用空格分割,你会得到一个一维数组,然后你可以再次分割并得到一个多维数组,就像你想要的那样:
String arrayS = "0,4.28 10,4.93 20,3.75";
String [] a = arrayS.spit(" ");
double [][] arrayD;
for(String j: a){
    arrayD.append(j.split(","));
}
//then print your array here

你确定 Java 中的数组有 append 方法吗?这个问题很具体。 - SomeDude
是的,我有点困惑,应该使用add或push,我不记得了,我只在Java中使用过ArrayList XD。 - Luis Romero

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