将保存双精度的对象转换为字符串,然后转换回双精度



我有一个二维对象数组(Object[][]数据),其中包含产品价格对。
我尝试通过以下方式将这些值传递给 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.我做错了什么?

尝试

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

你的问题在这里:

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

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

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

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

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

或者更好的是,只有当你不需要在第一个循环中构建的字符串表示时,用以下方式替换所有代码:

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

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

问题是,当你在":"上拆分每一对时,l的最后一个元素等于一个空白字符串。因此,拆分会产生一个包含空白字符串的 1 元素数组。发生此错误是因为您要求m[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]));
}

最新更新