将包含double的对象转换为字符串然后返回double

时间:2013-01-31 14:19:54

标签: java

我有一个二维对象数组(Object [] [] data),它包含产品对价格。
我尝试使用以下方式将这些值传递给Map。

private String myPairs = "";
private String[] l, m;

for (int i=0; i<data.length; i++){
    myPairs += (String)data[i][0] + ":" + String.valueOf(data[i][1]) + ",";
}

Map<String, Double> pairs = new java.util.HashMap<>();
l = myPairs.split(",");

for (int i=0; i<l.length; i++){
    m = l[i].split(":");
    pairs.put((String)m[0], Double.parseDouble((String)m[1]));             
}

我得到java.lang.ArrayIndexOutOfBoundsException。我做错了什么?

4 个答案:

答案 0 :(得分:2)

尝试

for (int i=0; i<l.length-1; i++){
    m = l[i].split(":");
    pairs.put((String)m[0], Double.parseDouble((String)m[1]));             
}

答案 1 :(得分:2)

你的问题在这里:

pairs.put((String)m[0], Double.parseDouble((String)m[1]));

第一个for循环创建一个以,结尾的字符串。例如"foo:0.1,bar:0.2,"

然后,您按,分割。因此,上面的示例将返回["foo:0.1"; "bar:0.2"; ""]。请注意空字符串值,因为字符串的最后,

最后,对于每个值,您将按:分割。它适用于前两个值(即["foo"; "0.1"]["bar"; "0.2"]),但最后一个值将是1值数组,包含空字符串:[""]

当尝试访问数组的第二个值(即索引1,因为数组从0开始索引)时,ArrayIndexOutOfBoundsException被抛出。


几种解决方案:

在第一个循环中,添加条件以添加,或不:

myPairs += (i == 0 ? "" : ",") + (String)data[i][0] + ":" + String.valueOf(data[i][1]);

OR 在第一次循环之后,删除字符串的最后一个字符:

myPairs = myPairs.substring(0, myPairs.length() - 1);

OR 在第二个循环中,不要直到最后一个值,而是直到 n-1 一个:

for (int i=0; i<l.length - 1; i++)

OR 更好,只有当您不需要在第一个循环中构建的字符串表示时,才能将所有代码替换为:

for (int i=0; i<data.length; i++) {
    pairs.put((String)data[i][0], Double.parseDouble((String)data[i][1])); 
}

答案 2 :(得分:1)

当第一个for循环结束时,你最后用','和一个额外的','分隔所有的对。因此,l.length是对的数量加1。但是,到目前为止,这不应该产生错误。

问题是当你在':'上拆分每一对时,l的最后一个元素等于一个空字符串。 因此,拆分会产生一个包含空字符串的1元素数组。发生错误是因为您要求m[1]

尝试不在对的最后一个元素之后添加',',问题应该解决。

我希望这有帮助:)

答案 3 :(得分:1)

, s分割中的最后一个元素是空的(因为你在第一个循环的最后一次迭代中说+ ","),所以跳过第二个循环中的最后一个元素。

for (int i = 0; i < l.length-1; i++)
{
    m = l[i].split(":");
    pairs.put((String)m[0], Double.parseDouble((String)m[1]));             
}

另请注意,如果提供的字符串包含: s或, s,您的算法也可能会抛出异常。

注意 - 更好的方法(以及避免上述方法)只是在第一个循环中执行此操作,例如:

for (int i = 0; i < data.length; i++)
{
    pairs.put((String)data[i][0], Double.parseDouble((String)data[i][1]));
}