-3

我有一个要转换为 double[] 数组的 Arraylist。我首先将 Arraylist 转换为 String []。然后我尝试将 String[] 转换为 double[] 但在此过程中失败。这是问题所在:字符串包含一些文本,以及一些带小数的数字。我只想将数字和小数转换为 double[] 数组并简单地删除文本。但是,我只知道如何使用 String 删除文本,而不是 String[]。请看一下:

import java.util.ArrayList;
import java.util.List;
import jsc.independentsamples.SmirnovTest;

public class example {
    public static void main(String[] arg) throws Exception {
        ArrayList<String> list1 = new ArrayList<String>();
        ArrayList<String> list2 = new ArrayList<String>();

        list1.add("RSP0001,1.11,1.22");
        list1.add("RSP0002,2.11,2.22");
        list1.add("RSP0003,3.11,3.22");
        list1.add("RSP0004,4.11,4.22");

        String[] str1 = new String[list1.size()];
        str1 = list1.toArray(str1);
        str1.replaceAll("RSP_\\d+","");
        double array1 = Double.parseDouble(str1);

        System.out.println(array1);
    }
}

两个错误由此而来:第一个是 str1.replaceAll 处的“找不到符号”错误。第二个是“Double.parseDouble”处的“方法 parseDouble”错误。问题是我需要一个字符串而不是字符串 []。

关于如何将我的 String[] 转换为 double[] 的任何想法?

谢谢,

kjm

4

5 回答 5

2

您需要在“,”上拆分 list1 中的每个字符串,并尝试解析每个拆分出来的字符串:

    ArrayList<Double[]> results = Lists.newArrayList();
    for( String s : list1 ) {
        String[] splitStrings = s.split(",");
        Double[] doublesForCurrentString = new Double[splitStrings.length];
        for(int i=0; i<splitStrings.length; i++){
            try {
                doublesForCurrentString[i] = Double.valueOf(splitStrings[i]);
            } catch( NumberFormatException ex ) {
                // No action.
            }
        }
        results.add(doublesForCurrentString);
    }
    Double[][] doubleArray = (Double[][])results.toArray();

关键点:

  • 编辑:正如@Tim Herold 指出的那样,在性能方面你可能会更好地避免尝试解析你知道是非数字的内容。在这种情况下,我仍然会先拆分,然后只输入阻止您尝试在每行中的第一个拆分字符串上进行 parseDouble() 的代码,而不是尝试在拆分之前进行字符串替换;这会更快(如果我们不关心性能,那么 try/catch 非常好并且更具可读性)。 ORIGINAL:当您尝试解析双打时,您需要尝试/捕获,以防有任何无效输入。奖励:您现在不需要删除非数字文本,您可以让这个 try/catch 处理它。
  • 你的琴弦每个都有两个双打。您不能只在开头剥离文本然后解析其余文本,因为它不会是有效的双精度。
  • ArrayLists 通常更容易使用;我会选择在一周中的任何一天返回ArrayList<Double>(或)ArrayList<ArrayList<Double>>。当然,在某些情况下我会采取不同的做法,但对我来说,你的情况听起来不像其中之一。Double[]Double[][]
于 2013-08-08T20:46:34.743 回答
1

循环遍历数组:

foreach String[]
    double[counter] = parseToDouble(String[counter])

编辑:
Java:

   String[] str1 = list1.toArray(str1);
   double[] dou1 = new double[str1.length]
   for(int counter = 0; counter < str1.length;counter++)
      dou1[counter] = Double.parseDouble(str1[counter].replaceAll("RSP_\\d+",""));
于 2013-08-08T20:04:12.830 回答
0

用这个

 String[] str1 = new String[list1.size()];
 str1 = list1.toArray(str1);
 double[] doubleArray = new double[str1.length]
 int i=0;
 for(String s:str1){
    doubleArray[i] = Double.valueOf(s.trim());
    i++;
 }
于 2013-08-08T20:16:51.067 回答
0

这将完成工作。

double[] doubles = new double[array1.length];
for(int i=0; i<array1.length; i++){
   doubles[i] = Double.valueOf(array1[i])
} 

感谢 SmartLemon 的编辑,您也可以这样做,而不是使用String[]

double[] doubles = new double[list1.size()];
for(int i=0; i<list1.size(); i++){
   doubles[i] = Double.valueOf(list1.get(i).replace("RSP_\\d+",""));
}

编辑:所以是的,你需要一个分隔符:

double[] doubles = new double[array1.length*2]; //multiply by 2 because you really have 8 numbers not 4
String [] array2 = null;

for(String string: array1) { 
    array2 = string.split(",");
    for(int i=0; i<array2.length; i++){
        doubles[i] = Double.valueOf(array2[i]);
    }
}

这应该可以肯定地完成工作。

于 2013-08-08T20:17:26.170 回答
-1

我会这样做:

  • 制作数组
  • 转换为字符串

然后这段代码

for (String s: list1) {
    boolean obtained = false;
    double tempD;

    try {
        tempD = Double.parseDouble(s); 
        obtained = true;
    } catch (Exception e) {
        e.printStackTrace();
    }

    if (obtained) {
        list2.add(tempD);
    }
}
于 2013-08-08T20:11:19.657 回答