【问题标题】:Turn string values into 2d array of type double将字符串值转换为 double 类型的二维数组
【发布时间】:2019-02-18 07:13:59
【问题描述】:

我有一个字符串:

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+),");

因此,对于 Array 中的每个元素,每 2 个逗号值的字符串。

不确定如何转换为二维数组。这甚至是正确的方法吗?

【问题讨论】:

  • 你能指定你的意思是多维还是二维?您的示例是二维的,我猜您对二维数组感兴趣 - 请更正以避免混淆。您还可以做出任何其他有用的提示或假设吗?矩阵是否会受到最大维度的限制(我认为限制是否合理)?
  • 抱歉,是的,它是一个二维数组。 2d 数组中的每个数组的固定长度为 2。如示例所示,它将成对
  • 如果您的字符串严格遵循输入中显示的模式,即逗号分隔的两个值对,并且每个这样的对由空格分隔 - 那么解决这个问题很简单,只需将字符串拆分为 \\s+ ,然后用“,”分割分割后的字符串中的每个字符串,然后使用Double.valueOf(string) 获得双精度,创建一个新的一维数组并将其插入二维数组。不确定这是否更复杂。

标签: java arrays multidimensional-array


【解决方案1】:

我会一步一步解决这个任务。

首先,我将原来的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 表达式更容易理解(我认为后者更酷、更优雅)。

【讨论】:

  • 我会将打印更改为System.out.println(String.format("%.0f and %.2f", pair[0], pair[1])); 以获得更好的格式。它在小数点后打印不必要的数字。
  • 这个0 and 4.28 而不是0.000000 and 4.280000
【解决方案2】:

这样的事情怎么样:

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 } 
}

【讨论】:

  • 只是在等待有人提出使用流的单线。 :)
【解决方案3】:

如果您的字符串遵循您描述的模式,那么您可以这样做:

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
}

【讨论】:

    【解决方案4】:

    假设您的字符串严格遵循给定的示例模式,您可以使用以下代码:

        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]);
        }
    

    【讨论】:

      【解决方案5】:

      如果你用 " " 分割得到一个一维数组,那么你可以再次分割得到你想要的多维数组:

      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
      

      【讨论】:

      • 您确定阵列上有append 吗?问题是 Java 特有的。
      • 是的,我很困惑,改为使用 add 或 push,我不记得它是什么,我只在 java xd 上使用 arralist
      猜你喜欢
      • 1970-01-01
      • 2019-01-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多