2017-10-30 19 views
4

조사한 후에도 여전히 내 문제의 특정 솔루션을 찾을 수 없습니다. 내 hashCode 메서드는 정확한 값을 사용하는 동안 "엡손"사용하는 "약 equals"메서드가 있습니다. 이것은 값을 비교할 때 HashSet의 전제 조건을 깬 것이다.일관성이없는 해시 코드 및 java와 같음

@Override 
public boolean equals(Object o) { 
    if (o == this) 
     return true; 
    if (!(o instanceof EPoint)) { 
     return false; 
    } 
    EPoint ePoint = (EPoint) o; 
    return Math.abs(Math.abs(ePoint.lat) - Math.abs(lat)) < EPSILON && Math.abs(Math.abs(ePoint.lon) - Math.abs(lon)) < EPSILON; 
} 

@Override 
public int hashCode() { 
    return Objects.hash(lat, lon); 
} 

hasCode()가 내 equals 메서드와 일치하도록 만드는 방법을 찾을 수 없습니다.

+0

(EPoint instanceof를 O)는, getClass하지 비교해야한다! instanceOf, 그렇지 않으면 가능한 하위 클래스에 문제가 발생할 위험이 있습니다. 그리고 지구상에 이것은 equals와 어떤 관련이 있습니까? return Math.abs (Math.abs (ePoint.lat) - Math.abs (lat)) Stultuske

+9

근사값에 equals를 사용하지 마십시오. 다른 이름의 메서드를 만듭니다. – Kayaman

+0

정확한 값을 모두 해시하는 대신 델타에 대한 차이를 해시하지 않는 이유는 무엇입니까? 같은 델타에 대해 같은 해쉬를 줄까요? 당신이 '평등'방법으로했던 것처럼. – Zabuza

답변

7

고객님의 equalshashCode에 도착하기 전에도 과도기적이지 않기 때문에 계약을 파기합니다.

  1. 것을 매 2 개 이웃이 동일하므로 두 점의 중간 점 (매우 긴) 체인이 있으므로

    이것은 또한 즉시 정수를 반환되는 유일한 일관 hashCode 구현 리드 따라서

  2. 매 2 개 이웃 시작하므로

  3. , 같은 hashCode 있어야하며 끝이 같은이 있어야합니다.

자,이 아주 분명 쓸모없는 하나 일관 구현,하지만. 당신의 등호의 Methos는이 구현되는 방법, 당신은 세 EPoints (pointA, pointB 및 pointC) 할 수 있습니다 :

2

나는 Kayaman에 동의

pointA.equals(pointB) //true 
pointA.equals(pointC) //true 
pointB.equals(pointC) //false 

을 그리고이 허용되지 않습니다. 다른 이름으로 메소드를 작성하는 것이 해결책 일 수 있습니다.
지도 그리드의 밖으로 EPoint에 대한 모든 EPoint :

그러나, 같은 해시 코드를 가지고 당신의 "거의 동일"개체를해야하는 경우에는 다른 방법을 시도 할 수 있습니다. 예를 들어 당신의 EPoint의 lat와 lon이 떠 다니는 경우, 각 EPoint를 반올림 된 int 값으로 EPoint에 매핑 할 수 있습니다.
더 높은 정밀도가 필요하다면,이를 확장하여 첫 번째, 두 번째 ... 소수 자릿수로 갈 수 있습니다. 당신은 등호()와 "매핑"포인트에 대한 해시 코드() 메소드를 할 경우

,이 모든 요구 사항을 만족해야합니다

@Override 
public boolean equals(Object o) { 
    if (o == this) 
     return true; 
    if (!(o instanceof EPoint)) { 
     return false; 
    } 
    EPoint ePoint = (EPoint) o; 
    return this.gridLon() == ePoint.gridLon() && ePoint.gridLat() == this.gridLat(); 
} 

@Override 
public int hashCode() { 
    return Objects.hash(this.gridLon(), this.gridLat()); 
} 
+0

그리드 시스템은 그가 찾고있는 것에 대해 작동하지 않을 것입니다 (그리고 작동하더라도 정말로 나쁜 아이디어 일 것입니다). – Kayaman

+0

더 명확하게하기 위해 제 대답이 업데이트되었습니다. –