2012-04-03 1 views
0

나는 자바로 많은 객체를 만든다. 각 객체에는 속성 영역과 정수 집합이 있습니다. 예를 들어지도에 이러한 객체를 저장하려고합니다. 키는 증가하는 순서로 정수 여야합니다. 두 객체의 면적이 동일하고 세트가 동일하면 두 객체가 동일합니다.자바에서 같은 객체 찾기

두 객체의 면적이 같지 않으면 설정이 동일한 지 확인할 필요가 없습니다.

Java에서 이것을 구현하는 가장 좋은 방법은 무엇입니까? 해시 함수와 등가 함수를 어떻게 구성해야합니까?

답변

1

을 여기에 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>의 동등성이 검사됩니다. 여기에 내장 된 equalsSet이므로이 방법을 다시 사용할 수 있습니다. 이것은 평등을 위해 복합 유형을 테스트하는 관용적 방법입니다.

1

Comparableinterface을 구현하고 로직을 compareTo 방법으로 코딩하면됩니다. 이를 달성하는 데 도움이되는 좋은 link가 있습니다.

+3

이것은 개체를 정렬 할 때만 필요합니다. 만약 당신이 그런 객체의 사전을 가질 필요가 있다면, 단지 적절한'hashCode()'와'equals()'만 필요합니다. –

1

equals (==과 유형 검사 이후)의 면적을 먼저 비교하고 차이가 있다면 false을 반환하십시오. 지역이 동일하면 계속해서 세트를 비교하십시오. 일반 equals (및 hashCode)를 구현하기위한

여기 (몇 상기 참조를 포함) 및 a relevant threada good article이다.

1

엄지 손가락의 규칙 (첫번째 빠른, 그래서 정면 다음 정수 세트를 당신의 area의 비교) 당신이 당신의 equals() 구현의 모든 관련 필드를 비교해야한다는 것입니다 귀하의 hashCode()에서 같은 필드를 사용합니다. 의심, Eclipse의 Source - Generate hashCode() and equals()... 기능을 사용 (. 다음 먼저 area들 비교하기 위해 equals() 코드를 수정)하는 경우