2017-05-24 96 views
0

我有一個Map<Integer,Double>作爲一個字段。我需要爲那個給定的類實現equals()比較雙打地圖

如何使用公差雙值進行比較。

+2

你總是可以拿出兩者之間的差異,並檢查它是否大於容差 –

+1

你在比較什麼?按鍵?價值?每個條目? – Nathan

+5

你*不*執行帶有容差的'equals()'。使用另一個方法名稱。否則,你會遇到麻煩 - 從破壞hashCode()和equals()之間的契約開始(https://stackoverflow.com/questions/27581/what-issues-應該被考慮) -overriding-等於-和哈希碼,在Java的)。 – Axel

回答

1
public class Foo { 
Map<Integer, Double> data; 

public Map<Integer, Double> getData() { 
    return data; 
} 

public void setData(Map<Integer, Double> data) { 
    this.data = data; 
} 

@Override 
public boolean equals(Object o) { 
    if (this == o) 
     return true; 
    if (!(o instanceof Foo)) 
     return false; 
    Foo foo = (Foo) o; 
    if (this.data.size() != foo.getData().size()) 
     return false; 

    Set<Integer> keySet1 = data.keySet(); 
    Set<Integer> keySet2 = foo.getData().keySet(); 
    // keys should same 
    if (keySet1.containsAll(keySet2) && keySet2.containsAll(keySet1)) { 
     // for the same key, the values are close 
     for (Integer key : keySet1) { 
      if (!isEntryEqual(data.get(key), foo.getData().get(key))) { 
       return false; 
      } 
     } 
     return true; 
    } 


    return false; 
} 

// also need to override the hashCode method 


@Override 
public int hashCode() { 
    List<Integer> keys = new ArrayList<Integer>(this.data.keySet()); 
    return Objects.hash(keys); 
} 

public static final Double PRECISION = 0.0001; 

private static boolean isEntryEqual(Double d1, Double d2) { 
    return d1 - d2 < PRECISION; 
} 
} 
+0

缺少「hashCode()」的匹配實現。 – Axel

+0

偉大的作品就像一個魅力。 – LonsomeHell

+0

我認爲hashCode()可以縮短爲'return this.data.keySet()。hashCode()'。 – Axel