2012-12-03 3 views
1

Java (전체 컨텍스트는 https://github.com/aisthesis/java-graph2012)의 그래프 라이브러리에서 작업 중이며 WeightedEdge 클래스의 hashCode()를 재정의해야합니다. 가장자리가 방향 지어지지 않습니다. 즉, equals() 오버라이드 메서드를 설정하여 두 가중치 e1과 e2에 대해 다음 조건 중 하나가 만족되면 같음을 나타냅니다. from() 및 to() 메서드는 tail 및 head의 정점을 반환합니다. 에지) :가장자리 클래스에 대한 Java hashCode() 덮어 쓰기

  1. e1.from() == e2.from() & & e1.to() == e2.to() 또는
  2. e1.from() == e2.to () & & e1.to() == 다른 맥락에서 e2.from()

, 나는 가중 가장자리의 HashSet의를 만들려면, 그리고 내가하지 않는 비켜 또한 중복 가장자리를 치울 내 equals() 재정의와 일치하도록 hashCode() 메서드를 구현하십시오.

그래서, 여기에 (내가 자바의 기본 해시 코드 (방해하지 않은) 내 정점 클래스 및로부터 정점 개체를 참조하는) 내 간단한 해결책 :

@Override 
public int hashCode() { 
    return from.hashCode() + to.hashCode();  
} 

내 추론 :

은 하나를 얻을 수있는 추가에 대한 효율적이기 때문에
  1. 그것은 효율적입니다 (나는 1도 2 해시 코드에 xor 수도 있겠죠?)
  2. 그것은 너무 에서 반전과 같은 해시 코드를 제공하기 위해 대칭입니다
  3. 일반적으로 은 정점이 다른 경우 별개의 해시 코드를 제공합니다.

포인트 3은 분명히 100 %에서 멀기 때문에 제 질문의 일부는 중요해야하는지 여부입니다.

내 일반적인 질문 :이 상황에서 hashCode()를 재정의하는 좋은 방법입니까?

+1

'WeightedEdge' 클래스를 보여주세요. '출발'과 '끝'의 유형은 무엇입니까? –

+0

https://github.com/aisthesis/java-graph2012/blob/master/src/com/codemelon/graph/edge/WeightedEdge.java 여기서 83ff 행. 관련된 것입니다. 'from'과'to'는 둘 다 Vertex 객체입니다. 기본 hashCode() 메소드를 오버라이드하지 않았습니다. –

답변

1

fromto은 합리적인 hashCode() 구현을 갖습니다. 솔루션은 문제가 없습니다.

+0

충돌을 피하는 동안 많은 양의 가장자리를 HashSet에 추가 할 때 xor-ing이 더 빠르다고 생각하십니까? –

+0

@MarshallFarrier : XOR이 정수 추가보다 빠르거나 충돌이 적을 것이라고 생각할 이유가 없습니다. 두 가지 모두 잘 작동해야한다고 생각합니다. – NPE