java将子列表添加到for循环中的嵌套哈希映射中

时间:2016-12-03 17:22:24

标签: java arraylist multidimensional-array hashmap

我有一个名为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());
        }

根据我的谷歌搜索,我看到我必须使用迭代器将元素添加到列表中以抛出错误,否则会发生错误。 但是我不明白我已经使用了循环,如何在这个嵌套循环中使用迭代器?

2 个答案:

答案 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);
         }    
     }
}

可能会更好,因为它不会尝试同时更改一个条目并且只能同时使用一个项目。