2016-11-03 88 views
0

我有以下的HashMap:如何總結HashMap <String,<String,Integer >>中的值?

HashMap<String, HashMap<String,Integer>> dataArray = new HashMap<>(); 

在節目中,我使用增強的循環迭代幾次,將數據插入到HashMap中,基於某種關鍵的,如:

dataArray.get(primaryKey).put(length, totalCost) 

它產生以下輸出:

{123-456-789={00:05:00=500, 00:01:06=220}, 999-090-090={00:08:01=900}} 

我使用一個公式來計算totalCost值,但是我有,以確保它在每個ITE設置爲0配給的開始。

我的問題是,我想總結totalCostlength值爲每個primaryKey。最終結果應該是這樣的:

{123-456-789={00:06:06=720}, 999-090-090={00:08:01=900}} 

我該如何實現這個目標?我是否必須創建另一個HashMap,或者是否可以修改已經存在的HashMap?可能有一個循環?

編輯:忘了提,如果我嘗試獲得現有totalCost值與dataArray.get(primaryKey).get(totalCost),編譯器會抱怨有可疑呼叫java.util.Map並返回null

+1

你是說像這樣? [IDEONE](https://ideone.com/v4j6ki) – Andreas

+0

這絕對有幫助,謝謝! – ForInfinity

+0

@Andreas,如果你發佈它作爲答案,它可能被標記爲答案。 – elfan

回答

0

爲什麼這麼複雜?只要改變你的數據結構。 OOP是爲了解決這個問題。只需將子表存儲在一個對象中,並提供適當的方法/變量。至於將數據插入現有的Map:您如何區分作爲標準值插入的結果和?此外,這很可能會導致併發修改,儘管有辦法解決這個問題。

+0

我很遺憾無法改變數據結構,它必須是我描述的方式。我知道我可以使用對象來實現這個目標,但由於限制我無法以任何方式影響,所以我無法這樣做。 – ForInfinity

+0

在這種情況下,您的最佳拍攝是用於存儲結果的第二個「地圖」。對於那個你至少可以使用'Pair'作爲值類型。 – Paul

+0

難道不可能獲得'length'和'totalCost'的現有值並簡單地將它們和新的值相加,而不是用'put'插入新的值?我試過這樣做,但由於某種原因,我無法獲得已經存在的那些。 – ForInfinity

0

如果您想以下面的形式得到最終結果: {123-456-789 = {00:06:06 = 720},999-090-090 = {00:08:01 = 900}} 爲什麼不通過在地圖中只保留一個鍵值對來改變你的循環:

Map.Entry<String,Integer> entry=dataArray.get(primaryKey).entrySet().iterator().next(); 
String key= entry.getKey(); 
dataArray.get(primaryKey).put(key + length, dataArray.get(primaryKey).get(key) + totalCost); 

我希望這有助於!

+0

編譯器不讓我得到內部映射的關鍵字,建議使用'Set key'來代替,但這也失敗了。 – ForInfinity

+0

我的壞處。試試這個,它應該工作得很好。 –

相關問題