2016-03-03 43 views
0

我知道你可以通過一個對象向某個方法傳遞任何東西。我正在嘗試編寫一個斷言函數來檢查兩個地圖是否相等。我不能只使用map1.equals(map2),因爲即使它們具有所有相同的鍵和值,它們也可能以不同的順序排列。所以我想通過第一張地圖上的每個鍵來獲得它的價值,並將其與第二張地圖中該鍵的價值進行比較。我想通常這樣做。所以我寫的(這是不大不小的存根,以證明我的問題,我會做更多的空檢查,等等。):用java實現通用映射

public void assertMapEquals(Map<Object, Object> f, Map<Object, Object> l) { 

    // This will do null checks, don't worry 
    for (Entry<Object, Object> ent : f.entrySet()) {  
     if (f.size() != l.size()) { 
      throw new AssertionError ("size mismatch"); 
     }  
     Object k = ent.getKey(); 
     Object e = ent.getValue(); 
     Object a = l.get(k);   
     if (!e.equals(a)) { 
      throw new AssertionError("unequal"); 
     }  
    } 
} 

然後我試着用兩個String映射到調用它:

public static void main(String[] argv) throws SQLException { 

    Map<String,String> m1 = new HashMap<>(); 
    Map<String,String> m2 = new HashMap<>(); 
    // Data will get filled in later 
    assertMapEquals(m1, m2); 
    // ... 
} 

但是Eclipse是給我下面的錯誤上的呼叫:

在 的方法assertMapEquals(地圖,地圖)類型MyMain1不適用於參數 (地圖,地圖)

不是字符串對象,所以爲什麼不能這樣工作,我該怎麼辦?這個問題可以應用於這種類型的任何示例,而不僅僅是比較兩張地圖。

我還有一個額外的問題是有沒有更好的方法可以做到這一點,但它並不關心訂單?

+0

爲什麼不使用'assertMapEquals(Map ,Map )'? – tumisma

+0

這就是我改變它,但它是可以想象的,我想打電話給它有時與其他類型的地圖。 – Tony

+0

只有在使用'TreeMap'時才能保證訂購。任何其他的'Map'都不會保留密鑰的排序 –

回答

2

您可以使用paramethized通用的方法,通過<?, ?>(不<K, V>,因爲在註釋中提到也可以是不同類型的,仍然相等,如Map<String, String> VS Map<Object, Object>

public static void assertMapEquals(Map<?, ?> f, Map<?, ?> l) { 
    if (f == null || l == null) 
     throw new NullPointerException(); 
    if (f.size() != l.size()) 
      throw new AssertionError ("size mismatch"); 
    for (Entry<?, ?> ent : f.entrySet()) {    
     Object k = ent.getKey(); 
     Object e = ent.getValue(); 
     Object a = l.get(k);   
     if (!Objects.equals(e, a))  // handle null values 
      throw new AssertionError("unequal"); 
    } 
} 

其他方法將只是直接比較地圖:

public static void assertMapEquals(Map<?, ?> f, Map<?, ?> l) { 
    if (f == null || l == null) 
     throw new NullPointerException(); 
    if (f.size() != l.size()) 
     throw new AssertionError("size mismatch"); 
    if (!f.equals(l)) 
     throw new AssertionError("unequal contents"); 
} 

通過合同,Map#equals(Object o)返回true iff oMap,它有相同的內容。