2009-10-30 40 views
0

我有兩個Map類型的地圖< Long,Integer >,一個名爲「oldValues」代表一個對象的舊狀態,另一個名爲「newValues」代表同一個對象的新狀態。知道Java中兩個Map <Long,Integer>之間是否至少有一個區別的可讀方法?

是否有一個簡單的&知道舊狀態和新狀態是否不同(即如果狀態已改變)的可讀方式?

理想情況下,我想一些「java.utils」或「阿帕奇百科全書」庫函數,如:

hasChanged = !MapUtils.diff(oldValues, newValues).isEmpty(); 

注:我找了,但沒有找到。

謝謝。

+5

是不是有一個原因,你不能使用'equals()'方法檢查'Map'是否相等?我想這要取決於你使用的標準Java實現是否是'Map',或者是一個可能無法正確定義'equals()'的自定義實現。 – 2009-10-30 13:56:42

+0

沒有理由,我想我需要休息一下!謝謝。 – 2009-10-30 14:10:04

回答

5

Doese'nt the equals method work?

+2

它取決於equals()方法的實現 - 因此我對這個問題發表了評論。我懷疑它會在方法的實施上。 – 2009-10-30 13:58:52

+1

它的工作原理,我想我需要一些睡眠。謝謝。 – 2009-10-30 14:08:53

2

等於似乎是一個壞主意,因爲檢查整個地圖的平等聽起來很昂貴。您還需要鎖定這兩個地圖以進行檢查以使其線程安全。

在ConcurrentHashMap中使用了一個想法,其中地圖使用計數器來檢測更改。如果這是公開的,你可以比較兩張地圖中的計數器是否相等。這不是,但是你可以用一個髒標誌或者一個表示包裹地圖的對象狀態的類來完成同樣的事情,並簡化相等性檢查。

+0

您*需要*可能檢查整個地圖是否相等(至少在平等情況下) - 如果地圖僅在您查看的最後一個地圖中有所不同,該怎麼辦?你的櫃檯比較也不管用;他們可以修改相同的次數,但添加了不同的值(並且由於相同的原因髒標誌不起作用)。檢查*的唯一方法是*比較每個名稱/值映射。 – 2009-10-30 17:25:27

+0

@dtsazza:在我看來,史蒂夫的骯髒的國旗肯定可以用來跳過完全平等的檢查,在沒有改變的情況下。 – CPerkins 2009-10-30 20:11:50

+0

謝謝,這很有趣。在我的情況下,地圖非常小(十個左右),並通過HTTP在一段時間內通過HTTP共享。所以平等就是我所需要的。 – 2009-10-30 20:57:37

相關問題