2013-03-17 80 views
0

所以這裏是我面臨的情況:我有可稱爲節點的可迭代對象。 (大約數千)每個節點包含許多鍵和值對。 並且我的算法創建一個新節點(稱爲myNode)並檢查可迭代集合中的每個節點,並且爲可迭代集合中的每個節點檢查 : 節點中每對(鍵值): 如果myNode包含如果myNode的對應值較大: 替換爲新值。 else:myNode.put(key,value)用於比較和插入的最有效的數據結構

目前,我使用HashMap來做這件事,它非常慢,我用ArrayList替換了HashMap後非常奇怪。 有人可以建議更好的數據結構來增加我的程序的性能嗎?

謝謝!

EDI:CODE

 ArrayList<Long> newDist = new ArrayList<Long>(); 

     HashMap<Long, Long> myNode = new HashMap<Long, Long>(); 

     for (Node i : nodes){//copy neighbors to set 
      Set<Long> view = i.keySet(); 
      for (Long j : view) { 
       if (!(myNode.containsKey(j))) { 
        myNode.put(j, i.get(j)); 
       } else if (myNode.get(j) > i.get(j)) { 
        myNode.put(j, i.get(j)); 
       } 
      } 
     } 

     context.write(key, myNode); 
+0

你可以發佈你的實際代碼,因爲HashMap很可能應該是最好的選擇。 – 2013-03-17 08:36:31

回答

0

我不完全相信你的代碼的意圖是什麼,因爲它引用您還沒有包括一些對象,但如果NodeMap話,我會做這樣的事情。 ...

Map<Long, Long> lowScores = new HashMap<Long, Long>(); 

for (Node node : nodes){ 
    for (Entry<Long,Long> entry : node.entrySet()) { 
    Long lowScore = lowScores.get(entry.getKey()); 
    if (lowScore == null || lowScore > entry.getValue()){ 
     lowScores.put(entry.getKey(), entry.getValue()); 
    } 
    } 
} 

有在這裏的幾個優化,限制那些對大型數據結構進行的操作量,但我只運行會證明這是優化的東西,編譯器是不是已經爲您優化。關鍵優化是遍歷MapEntry對象,而不是繼續呼叫getcontainsKey