2010-04-09 5 views
1

두 쌍의 항목이 다른 쌍의 항목보다 엄격하게 작 으면 쌍을 다른 쌍보다 작게 간주하고 두 항목이 모두 두 쌍의 항목보다 엄격하게 큰 경우 다른 쌍보다 큰 경우 다른 한 쌍. 다른 모든 경우는 비교할 수없는 것으로 간주됩니다.내 Comparator가 위아래로 버블 링하는 동안 예외를 throw하면 PriorityQueue는 어떻게됩니까?

이 문제를 해결하려면 위의 내용을 구현하는 Comparator을 정의하는 것이지만 비교할 수없는 경우 예외가 발생하고 PriorityQueue에 제공해야합니다. 물론, 짝을 삽입하는 동안 우선 순위 큐는 힙에서 올바른 위치로 새 항목을 버블 링하는 동안 몇 가지 비교를 수행하며, 이들 중 많은 부분이 비교 될 것입니다. 그러나이 새로운 쌍을 비교할 수없는 쌍이 발생하고 예외가 발생하는 버블 링 프로세스 중에 발생할 수 있습니다. 이 경우 PriorityQueue의 상태는 어떻게됩니까? 예외를 던지기 전에 내가 삽입하려고했던 쌍이 마지막 위치에 힙에 앉아있을 것입니까? PriorityQueue's remove(Object o) 메서드를 사용하면 PriorityQueue이 일관된 상태로 복원됩니까? 는 PriorityQueue 인의 아니다으로, 의미가 -

감사

답변

1

당신이 PriorityQueue 소스 코드를 보면 추가 할 때,/새로운 요소에게 .compare() 방법을 제공하는 어떤 시도/캐치 (이 siftUpUsingComparator()에)없이 호출 비교할 수없는 요소를 대기열에 넣지 못하게해야합니다. 따라서 Comparator에 의해 던져지는 RuntimeException은 호출 코드에 버블 링됩니다.

큰 질문은 여기 왜 당신이 정의에 따라 "비교할 수없는"항목을 정렬하려고합니까? 이것은별로 의미가 없습니다. 항목의 유형이 같지만 다른 항목보다 크거나 작지 않은 경우 Comparator는 해당 항목을 동일한 유형으로 반환해야합니다. Comparator의 의미는 "equal"은 "같은 값을 가짐"을 의미하는 것이 아니라 "비교되는 요소와 동일한 순서를 가짐"을 의미합니다. 즉, 두 항목을 원할 때 동등 (0)을 반환합니다. 정렬에서 서로 옆에 정렬됩니다.

+0

내가 실제로하려고하는 것은 엄격하게 성장하는 쌍 중에서 가장 긴 시퀀스를 얻는 것입니다. 예외를 던지면이 시퀀스에 맞지 않는 쌍을 취소하려고합니다. BTW : 나는 그것을 포기하고, 내 힙에 null 요소로 끝났다. –

+0

아마도 PriorityQueue가 당신이 원하는 것을위한 최상의 데이터 구조가 아닐까요? –

관련 문제