我有一个二维对象数组(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
。我做错了什么?
答案 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]));
}