2016-09-26 62 views
2

我遇到以下問題,因此我想要一個體面的解決方案。
將地圖與集合同步的最佳複雜性

我有一個HashMap,它包含一些String(email)和object(Person)形式的對象。
如下所述該映射通過集合經由方法updatePersonList(集合列表)填充:每當一個新的集合是通過上述方法接收到的地圖將基本上從集合的所有元素添加到
地圖。這就是所有的地圖需求,最新的收藏。應該從地圖中丟棄收集中的什麼。

現在,我想知道我怎麼能有效地更新地圖,因爲它可以讀取它上面可能有以下情況:
1.某些對象可以在地圖和收藏都可以找到因此,只有來自集合的新對象應該被保留,而不是全部。
2.映射中但不在集合中的對象應該被刪除。

複雜性方面的最佳解決方案是什麼?
經過一番調查後,我從地圖中刪除了所有對象,並添加了集合中的所有對象。如果有人知道一些更好的東西,如果它可以共享的話會更好。

回答

3

你將永遠不會得到比O(N + M)其中n是您Collection和M尺寸你的0的大小,因爲你總是需要閱讀至少兩個。

所以在O -notation你可以簡單地刪除洞Map並創建一個新的。

但實際上常量可能不是那麼不重要,你也可能想減少垃圾收集。在這種情況下,遍歷兩者都可能是有意義的,並且只從Map中刪除所需的條目,並將Collection中的新元素添加到Map中。

但是隻有分析纔會告訴你,如果你爲此付出了任何努力。

+0

這就是我想到的,因爲據我所知,在刪除數據時,地圖會縮小並縮小其大小,添加期間它會在添加數據後調整大小。這可能不是如此的記憶表現。糾正我,如果我錯了。 –

+0

@Andrei T:因爲Map中的元素被刪除並且新的元素被創建,所以會有更多的垃圾→如果你刪除了空洞圖並創建一個新的垃圾收集,那麼經常是一個垃圾收集。但是如果這對你的應用程序有明顯的影響,那麼只有在比較兩個實現並對它們進行分析後才能知道。 – MrSmith42

0

根據我的觀點用樹形圖的點,而不是清單,以提高你的迭代性能即(樹形圖將唯一的值),從而使得新插入的對象會自動識別

成功地設計樹形圖不刪除標記後在地圖上,而不是添加新聞標記,這將在樹形圖

我希望把它定義將有助於

0

如果列表的內容通常與地圖的內容相同,您可以在清理地圖並添加新條目之前進行檢查。