2017-02-24 50 views
0

所以我認爲我可以使用HashMap,但它不起作用,因爲第一個鍵不會是唯一的 - 數據集中獨一無二的是密鑰1和密鑰2的組合。需要一些像<key(不唯一)<key, double>>的ds - 不確定要使用什麼

我想過將密鑰串聯成一個字符串來強制唯一性,我認爲這應該起作用,但我想確認是否存在「以任何其他方式。需要明確的是,我所期待的一種數據結構,我能...

  1. 查找第一個關鍵
  2. 查找第二個關鍵
  3. 訪問存儲雙

這在嵌套的HashMap中工作,但由於第一個鍵不會是唯一的,所以它會在新的第二個鍵上更新,在下一個迭代中雙鍵更新。

從搜索中,似乎有一個建議是從Apache的庫中使用Multimap,但我不想在訪問第一個鍵時返回一個列表。我最終只想通過訪問第一個鍵然後第二個鍵來獲得雙倍。

有什麼建議嗎?或者我應該試着讓串聯工作?

示例代碼

if(map.get(first[1]) != null && 
    map.get(first[1]).get(second[1]) != null) { 

    HashMap<String, Double> inner = map.get(first[1]); 
    inner.put(second[1], inner.get(second[1]) + 1.0); 

} else { 

    map.put(first[1], new HashMap<>()); 
    map.get(first[1]).put(second[1], 1.0); 
} 

的,檢查是不是確有必要 - 應該只是第二個條件

+0

你說的是雙倍的,但是那張圖保存了整數,並且存在一些問題。您將第一個鍵(用於外部映射)放入內部映射中,並且如果外部映射已經具有一個,則插入一個新的HashMap,因爲內部映射沒有第二個鍵,因此失去了所有先前的信息。 –

+0

對不起,這些都是拼寫錯誤。雙/整數,或者沒問題。最終,只是試圖更新和訪問值。第一[1] inner.put應該肯定是第二[1]。 – cpd1

+0

還有一些你沒有提到的東西。看起來你並不是想插入一個特定的值,而是增加一個計數器? –

回答

0

你不想多重映射。你的第一個直覺是正確的,你可以做到這一點Map<FirstKey, Map<SecondKey, Integer>>。但要插入它,您必須考慮FirstKey的內部映射可能已經創建或未創建的可能性。

根據您的修改,我想你想計數第二鑰匙已經插入到地圖的次數,而不是特定的值與它相關聯。我已經重寫了這個答案,將其考慮在內。

​​

如果你想使用雙,而不是整數這是一個簡單的變化,但整數更自然,如果我們只是計算的出現。

+0

謝謝大衛!是的,我注意到我需要考慮一個新的HashMap。但如果第一把鑰匙不是唯一的,這不會是一個問題嗎?就像稍後有另一個「富」,但第二個關鍵是「動物園」。我會失去「富/酒吧」 – cpd1

+0

@ cpd1不,你不會。外部地圖將包含「foo」的地圖,其中將包含兩個鍵「bar」和「zoo」。 –

+0

好的,我會再看看我的代碼。當我重複了這些變化之後,我看到關鍵字被新值所取代。 – cpd1

相關問題