2012-04-08 2 views
0

두 개의 트리가 있습니다. 노드를 포함하고 있습니다. 생성 한 후에는 첫 번째 트리의 모든 노드를 linkedlist로 가져오고 두 번째 트리는 hashmap으로 가져옵니다. 지도의 키로 나는 나무에서 두 ​​개의 노드를 찾고 싶다. 같은 변수가있다 : states (long 타입). 그래서 생성 후 내가 전화 : 내가 해시 맵을 사용하고어떤 데이터 구조가 2 트리의 교차점을 찾는데 사용합니까?

List<Node> list; 
HashMap<Node, Node> hashtable; 

...create nodes, take them to the collections 

for(Node n : list){ 
    if(hashtable.containsKey(n)){ 
     //doSomething   
    } 
} 

, 그것은 매우 빠르고 렸기 때문에, 힘든 내가 4,000,000 (400 만) 노드를 가지고있다. 나는 Node 클래스의 equals 메소드를 오버라이드했지만, containskey 메소드가 hashcodes를 검사하는 것처럼 보이지만, 나는 단지 equals 메소드를 확인해야한다는 것을 이해했다. link to java reference. 그래서 질문은 데이터 구조가 무엇을 사용해야하는지,이 것을 확인해야하는지, 어떻게 코드를 다시 작성해야합니까?

을 Heres의 내 equals 메소드 :

@Override 
    public boolean equals(Object obj) { 
    if(obj instanceof Node){ 
     Node node = (Node)obj; 
     return (states == node.getStates()); 
    } 
    return false; 
} 

답변

0

당신은 같은 해시 코드를 가지고 있어야합니다 equals() 그래서 동일한 개체를 오버라이드 (override) 할 때 hashCode() 메서드를 재정의해야합니다. http://docs.oracle.com/javase/6/docs/api/java/lang/Object.html#equals(java.lang.Object 참조).

+0

내가 부모와 상태 변수를 사용하여 해시를 만든 다음 고유 한 경우, 상태 변수 만 사용하면 동일한 상태의 노드가 너무 많아서 해시 맵에서 약 50000 노드는 2 백만 개가 아닙니다. 하지만 여전히 자신의 상태가 동등하면 노드가 같아야합니다. –

+0

나는 해시를 사용하여지도의 노드를 정렬하고자 함을 의미합니다. –

+0

이 명령은''equal()''과''hashCode()''에 대한 요구 사항을 취소하지 않습니다. 그래서 당신은''노드''로 구성된 두 개의 나무를 가지며 교차점을 찾고 싶습니다. 이를 위해 훌륭한 Apache 유틸리티를 사용하는 것이 좋습니다. [link] (http://commons.apache.org/collections/apidocs/org/apache/commons/collections/CollectionUtils.html#intersection (java.util.Collection, % 20java.util.Collection)) –

관련 문제