我有一个名为banksNumberOfOrders
的多维数组,它用一些整数值初始化。
我已经构建了嵌套的hashmap,它有两个整数键,它们也是banksNumberOfOrders
的行索引和列索引,并且有一个列表。
我通过嵌套for循环将banksNumberOfOrders[i][j]
的随机值添加到列表中。此外,我还通过相同的嵌套for循环将此列表的子列表添加到嵌套的hashmap中。
我写的代码是
Map<Integer, Map<Integer,List<Integer>>> paymentOrderAmounts = new HashMap<Integer, Map<Integer,List<Integer>>>();
List<Integer> amounts = new ArrayList<Integer>();
int count_begin = 0; //list size
for (int i=0; i<n; i++){
for(int j=0; j<n; j++){
if(i != j){
for(int a=0; a<banksNumberOfOrders[i][j]; a++){
int amount = ThreadLocalRandom.current().nextInt(begin1, end1);
amounts.add(amount);
}
int count_end = count_begin+banksNumberOfOrders[i][j];
paymentOrderAmounts.put(i, new HashMap<Integer,List<Integer>>());
paymentOrderAmounts.get(i).put(j, amounts.subList(count_begin, count_end));
count_begin = count_end;
System.out.println(i+" --> "+j+" "+paymentOrderAmounts.get(i).get(j)+" ");
}
}
System.out.println();
}
此代码正在运行,没有错误和打印值。 但是当我尝试打印嵌套hashmap的值时,由于子列表的用法,我给出了 concurrentmodificationexception 。 导致错误的第二个代码段,如
//traverse hashmap and print values
for(Map.Entry<Integer, Map<Integer,List<Integer>>> t:paymentOrderAmounts.entrySet()) {
Integer key = t.getKey();
for (Entry<Integer, List<Integer>> e : t.getValue().entrySet())
System.out.println(key + "-->" + e.getKey()+" "+e.getValue());
}
根据我的谷歌搜索,我看到我必须使用迭代器将元素添加到列表中以抛出错误,否则会发生错误。 但是我不明白我已经使用了循环,如何在这个嵌套循环中使用迭代器?
答案 0 :(得分:0)
如果您是以多线程方式做事,使用java.util.concurrent.ConcurrentHashMap
而不是java.util.HashMap
可能很重要。另请参阅java.util.concurrentConcurrentSkipListMap
作为替代方案,它将以较不随机的密钥顺序进行迭代。
答案 1 :(得分:0)
要遍历地图,
for(Integer outerKey: paymentOrderAmounts.keySet()) {
Map<Integer, List<Integer> innerMap = paymentOrderAmounts.get(outerKey);
for (Integer innerKey: innerMap.keySet()) {
List<Integer> innnerList = innerMap(innerKey);
for (Integer innerValue: innerList) {
System.out.println(outerKey + "-->" + innerKey +" "+innerValue);
}
}
}
可能会更好,因为它不会尝试同时更改一个条目并且只能同时使用一个项目。