【问题标题】:Convert String[] with text to double[]将带文本的 String[] 转换为 double[]
【发布时间】:2013-08-08 20:01:13
【问题描述】:

我有一个要转换为 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

【问题讨论】:

  • 如果这是java代码,你应该使用java标签。
  • 另外,您是否有任何理由创建ArrayList&lt;String&gt;,然后立即转换为String[],而不是一开始就创建String[]
  • 是的,这是有原因的:上面的代码是更长代码的一小部分,为此,我需要 ArrayLists。
  • 啊好吧,这更有意义。在这种情况下,它可能有助于准确地分解你想要做的事情。听起来您想为列表中的每个项目做一些事情,但您试图直接传递列表,而不是实际循环遍历每个元素。
  • 这就是这个问题被否决的原因吗?

标签: java arrays string arraylist double


【解决方案1】:

您需要在 "," 上拆分 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,以防有任何无效输入。奖励:你现在不需要删除非数字文本,你可以让这个 try/catch 处理它。
  • 每个字符串都有 两个 双精度。您不能只在开头剥离文本然后解析其余文本,因为它不会是有效的双精度。
  • ArrayLists 通常更容易使用;我会选择在一周中的任何一天返回ArrayList&lt;Double&gt;(或ArrayList&lt;ArrayList&lt;Double&gt;&gt;)而不是Double[]Double[][]。当然,在某些情况下我会采取不同的做法,但在我看来,你的情况并非其中之一。

【讨论】:

  • 我不推荐使用try{}catch(){} 作为程序逻辑,你应该提取非双字符
  • 我在“列表”下收到“找不到符号”错误。我导入了 java.lang.Object,所以我不确定出了什么问题。有什么想法吗?
  • ListsGuava 的一部分,但它只是一种帮助方法,可以更轻松地使用 java.util.collections。你可以用 new ArrayList 替换那个调用就可以了。
  • @Tim Herold:你的观点很好。在这种情况下,使用众所周知的格式,您可以在不运行正则表达式的情况下排除非双字符(例如,通过不尝试从 split() 解析第一个字符串),是的,这可能值得这样做。但是,如果非双字符的频率非常低,我会使用 try-catch 而不是在每一行上运行正则表达式,只是针对偶尔的非数字字符。
【解决方案2】:

循环遍历数组:

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

编辑:
爪哇:

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

【讨论】:

  • 解析为 Double 可能应该包括全部替换:D
  • 对不起,“for each String[]”是什么意思?你是在增加我拥有的东西还是替换一些东西?谢谢
  • "str1.size()" 在任一实例中均未找到。我认为这是因为 str1 是 string[] 而不是 string
  • 对不起,.size() = .length
  • “str1 可能没有被初始化”错误在第一行。也许我需要在将其放入数组之前声明它?
【解决方案3】:

使用这个

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

【讨论】:

  • 这会导致输入字符串出现“数字格式异常”错误。这就是为什么我需要从输入中删除 RSP d+ 表达式
  • 从字符串开头删除内容不足以使其正确输入。 ",1.11,1.22" 仍然不是有效的双精度数。您实际上要解析这两个以逗号分隔的数字中的哪一个?然后构建一个正则表达式。
【解决方案4】:

这样就可以了。

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

这肯定可以完成工作。

【讨论】:

  • 我不知道为什么你需要从ArrayList&lt;String&gt; 传递到String[] 但如果有特殊情况,那么只需使用代码的第一个sn-p,其中array1 是@ 987654328@
  • 对于第二个“sn-p”,我得到输入字符串的“格式编号异常”。
  • 另外,我认为“新双打”应该是“新双打”
  • 嗯,这取决于你的字符串,如果你得到一个 NumberFormatException 它表明你的字符串不完全是一个纯数字字符串,请尝试在解析之前打印字符串“数字”。
  • 你确定正则表达式它实际上返回了一个有效的双数吗?我看到 2 个可能的定界符有一个“。”或“,”我认为您的正则表达式在第一次替换“,1.11,1.22”时返回它,当然它会抛出 NumberFormatException。
【解决方案5】:

我会这样做:

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

然后这段代码

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

【讨论】:

  • 请整齐地格式化您的代码(我认为您还缺少}
  • 对不起,我是这个网站的新手。每次我按下回车键时,我都很难让解析器将其识别为代码。
  • 看起来list1 是原始的String[]list2 是他存储解析结果的Double[]
猜你喜欢
  • 1970-01-01
  • 2013-11-10
  • 1970-01-01
  • 2013-05-02
  • 1970-01-01
  • 2012-05-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多