2011-10-12 2 views
2

숙제의 경우 TreeSet에 넣을 수 있도록 휴리스틱에 기반한 노드를 비교해야합니다. 그러나 두 개의 노드에 대한 경험적 가치가 같을 때 나는 동점을 깰 수있는 방법이 필요합니다.비교기의 FIFO 타이 브레이커?

제공된 Node 클래스를 수정할 수 없으며 Node의 다른 값/속성이 없다면 이미 사용하고 있지 않은 넥타이를 깨뜨릴 수 있습니다. (우리는 퍼즐을 다루고 있지만 실제로 중요하지는 않습니다.) TreeSet에 추가했을 때 관계를 깰 수있는 방법이 있습니까? 나는 그것에 대해 어떻게 해야할지 모르겠다. ...

문서에서 우선 순위 차단 대기열에 대한 예제를 보았지만 Comparator 인터페이스를 사용하려고하는데 제대로 작동하지 않는다.

미리 감사드립니다. 모든 팁/힌트는 대단히 감사하겠습니다.

답변

1

노드에 대한 래퍼를 만들 수 있습니까?

public class NodeWrapper implements Comparable<NodeWrapper> { 
    private static AtomicLong serialNumGenerator = new AtomicLong(0L); 

    private final Node node; 
    private final long serialNum; 

    public NodeWrapper(Node node) { 
    this.node = node; 
    this.serialNum = serialNumGenerator.getAndIncrement(); 
    } 

    @Override 
    public int compareTo(NodeWrapper other) { 
    int compare = this.node.compareTo(other.node); 
    if (compare == 0) { 
     compare = (this.serialNum < other.serialNum) 
      ? -1 
      : ((this.serialNum > other.serialNum) ? 1 : 0); 
    } 
    return compare; 
    } 
    // implement other methods including equals() and hashCode() 
} 
+0

감사합니다 - 그건 나에게 의미가 있습니다! – bee

1

System.identityHashCode(Object)을 사용하면 개체를 정렬하는 데 사용할 수있는 int를 얻을 수 있습니다.

+0

실제로는 * 실제로는 작동하지만, 동일하지 않은 인스턴스가 동일한 값을 반환하는 것은 허용됩니다. 사실 2^32 + 1 노드가 있다면 두 개의 동일하지 않은 노드가 동일한 ID 해시 코드를 갖게됩니다. –