2017-05-24 9 views
0

I hava a Map<Integer,Double>를 필드로 사용하십시오. 해당 클래스에 대해 equals()을 구현해야합니다.두 배의지도를 비교하십시오

허용 오차를 사용하여 double 값을 비교하는 방법.

+2

항상 두 가지 차이점을 확인하고 허용치보다 큰지 확인하십시오 –

+1

무엇을 비교하고 있습니까? 열쇠? 값은? 모든 항목? – Nathan

+5

당신은 허용 오차를 가지고'equals()'를 구현하지 않습니다. 다른 메소드 이름을 사용하십시오. 그렇지 않으면'hashCode()'와'equals()'사이의 계약을 깨는 것부터 시작됩니다. (https://stackoverflow.com/questions/27581/what-issues-should-be-considered-when -overriding-equals-and-hashcode-in-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()는'this.data.keySet(). hashCode()'를 반환하도록 단축 할 수 있다고 생각합니다. – Axel