2016-12-03 80 views
0

我有一個多維數組,其名稱爲banksNumberOfOrders,它用一些整數值初始化。java將子列表添加到for循環中的嵌套哈希映射中

我已經建立了嵌套的hashmap,它有兩個整數鍵,它們也是行和列索引banksNumberOfOrders並且有一個列表。

我通過嵌套for循環將隨機值banksNumberOfOrders[i][j]添加到列表中。此外,我還通過相同的嵌套for循環將此列表的子列表添加到嵌套的哈希映射中。

我編寫的代碼是諸如

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的值時,由於子集列表的使用情況,我正在給出併發修改異常。 二碼片如

//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

你可以發佈拋出ConcurrentModificationException和完整堆棧跟蹤的代碼嗎? – 2016-12-03 17:27:26

+0

我可能會建議你使用某種表格(行,列,值),請參閱番石榴表格,例如:https://github.com/google/guava/wiki/NewCollectionTypesExplained#table – 2016-12-03 17:28:48

+0

對於我的理解,此表格格式(行,列,值),但我需要(行,列,值)的結構 –

回答

0

如果您正在以多線程方式進行操作,則使用java.util.concurrent.ConcurrentHashMap而不是java.util.HashMap可能很重要。另請參閱java.util.concurrentConcurrentSkipListMap作爲替代方案,它將以較不隨機的密鑰順序迭代。

+0

沒有mutthread,也不明白你的第二個建議。 –

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

可以更好地工作,因爲它是不是要搶同時改變和的entrySet只是一個項目,在工作一段時間。

+0

列表 innnerList = innerMap(innerKey);給出警告方法innerMap(Integer)未定義 –

0
 Table<Integer, Integer, List> paymentAmounts = HashBasedTable.create(); 
     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];   
        paymentAmounts.put(i,j,amounts.subList(count_begin, count_end)); 
        count_begin = count_end; 
        System.out.println(i+" --> "+j+" "+paymentAmounts.get(i, j)+" "); 
       } 
      }  
      System.out.println(); 
     } 

     System.out.println(paymentAmounts.cellSet()); //gives error