0

我有一个包含成对产品价格的二维对象数组(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. 我做错了什么?

4

4 回答 4

2

尝试

for (int i=0; i<l.length-1; i++){
    m = l[i].split(":");
    pairs.put((String)m[0], Double.parseDouble((String)m[1]));             
}
于 2013-01-31T14:23:36.790 回答
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 的索引)时,ArrayIndexOutOfBoundsExceptionget 被抛出。


几种解决方案:

在第一个循环中,放置一个添加,或不添加的条件:

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])); 
}
于 2013-01-31T14:33:42.810 回答
1

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

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

尽量不要在对的最后一个元素之后添加“,”,问题应该得到解决。

我希望这有帮助 :)

于 2013-01-31T14:33:20.287 回答
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]));
}
于 2013-01-31T14:33:28.223 回答