나는 자바로 많은 객체를 만든다. 각 객체에는 속성 영역과 정수 집합이 있습니다. 예를 들어지도에 이러한 객체를 저장하려고합니다. 키는 증가하는 순서로 정수 여야합니다. 두 객체의 면적이 동일하고 세트가 동일하면 두 객체가 동일합니다.자바에서 같은 객체 찾기
두 객체의 면적이 같지 않으면 설정이 동일한 지 확인할 필요가 없습니다.
Java에서 이것을 구현하는 가장 좋은 방법은 무엇입니까? 해시 함수와 등가 함수를 어떻게 구성해야합니까?
나는 자바로 많은 객체를 만든다. 각 객체에는 속성 영역과 정수 집합이 있습니다. 예를 들어지도에 이러한 객체를 저장하려고합니다. 키는 증가하는 순서로 정수 여야합니다. 두 객체의 면적이 동일하고 세트가 동일하면 두 객체가 동일합니다.자바에서 같은 객체 찾기
두 객체의 면적이 같지 않으면 설정이 동일한 지 확인할 필요가 없습니다.
Java에서 이것을 구현하는 가장 좋은 방법은 무엇입니까? 해시 함수와 등가 함수를 어떻게 구성해야합니까?
을 여기에 IDE에 의해 생성 hashCode\equals
의 샘플 쌍의 :
class Sample {
final int area;
final Set<Integer> someData;
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Sample sample = (Sample) o;
if (area != sample.area) return false;
if (!someData.equals(sample.someData)) return false;
return true;
}
@Override
public int hashCode() {
int result = area;
result = 31 * result + someData.hashCode();
return result;
}
}
이 코드는 가정 someData
수 없어 null 일 것 - 단순화하는 것. 먼저 유형의 평등이 검사 된 다음 area
평등이 확인 된 다음 Set<Integer>
의 동등성이 검사됩니다. 여기에 내장 된 equals
이 Set
이므로이 방법을 다시 사용할 수 있습니다. 이것은 평등을 위해 복합 유형을 테스트하는 관용적 방법입니다.
equals
(==
과 유형 검사 이후)의 면적을 먼저 비교하고 차이가 있다면 false
을 반환하십시오. 지역이 동일하면 계속해서 세트를 비교하십시오. 일반 equals
(및 hashCode
)를 구현하기위한
여기 (몇 상기 참조를 포함) 및 a relevant threada good article이다.
엄지 손가락의 규칙 (첫번째 빠른, 그래서 정면 다음 정수 세트를 당신의 area
의 비교) 당신이 당신의 equals()
구현의 모든 관련 필드를 비교해야한다는 것입니다 귀하의 hashCode()
에서 같은 필드를 사용합니다. 의심, Eclipse의 Source - Generate hashCode() and equals()...
기능을 사용 (. 다음 먼저 area
들 비교하기 위해 equals()
코드를 수정)하는 경우
이것은 개체를 정렬 할 때만 필요합니다. 만약 당신이 그런 객체의 사전을 가질 필요가 있다면, 단지 적절한'hashCode()'와'equals()'만 필요합니다. –