>  기사  >  Java  >  PriorityQueue.toString()이 PriorityQueue의 항목 순서를 정확하게 반영하지 않는 이유는 무엇입니까?

PriorityQueue.toString()이 PriorityQueue의 항목 순서를 정확하게 반영하지 않는 이유는 무엇입니까?

Patricia Arquette
Patricia Arquette원래의
2024-10-31 05:25:02214검색

Why does PriorityQueue.toString() not accurately reflect the order of items in a PriorityQueue?

PriorityQueue.toString() 순서 이상: 설명

PriorityQueue에서 요소를 검색하려고 할 때 출력이 예기치 않은 동작에 직면할 수 있습니다. 순서가 예상 우선순위와 일치하지 않습니다. 이는 PriorityQueue.toString()이 정렬된 순서를 나타내지 않을 수 있는 대기열 내부 상태의 스냅샷만 제공하기 때문입니다.

이 문제를 해결하려면 toString()에 의존하는 대신 폴링해야 합니다. poll() 메서드를 사용하여 대기열에서 항목을 하나씩 가져옵니다. 그 이유는 다음과 같습니다.

힙 구조 및 대기열 순서

내부적으로 PriorityQueue는 힙 데이터 구조를 활용하여 정렬된 순서를 효율적으로 유지합니다. 그러나 힙이 항상 완전히 정렬되지는 않습니다. 대신 각 노드를 상위 및 하위 노드와 비교하는 부분적으로 정렬된 트리입니다.

큐에서 항목을 추가하거나 제거하면 힙이 조정되어 부분 순서를 유지합니다. 결과적으로 대기열에서 toString()을 호출하면 현재 상태의 스냅샷만 표시되며 이는 예상 우선순위와 일치하지 않을 수 있습니다.

해결책: Poll() 사용

정렬된 순서로 요소를 얻으려면 poll() 메서드를 사용하여 하나씩 폴링해야 합니다. poll() 메소드는 힙 상단에서 작동하여 나머지 노드의 순서를 유지하면서 루트 노드를 제거합니다.

코드 예

이를 설명하기 위해, 코드에 다음 수정 사항을 고려하십시오.

<code class="java">import java.util.Comparator;
import java.util.PriorityQueue;

public class TreeNodeHuffman {

    public static void main(String[] args) {
        HuffmanComparator compare = new HuffmanComparator();

        // Create and initialize PriorityQueue
        PriorityQueue<TreeNodeHuffman> queue = new PriorityQueue<>(26, compare);
        // ... Add nodes to the queue

        // Poll and print items
        while (!queue.isEmpty()) {
            System.out.println(queue.poll());
        }
    }
}</code>

poll() 메서드를 활용하면 이제 요소가 대기열에서 제거될 때 정렬된 순서로 볼 수 있습니다.

[z, q, x, j, k, v, b, m, i, c, e, s, o, w, a, r, h, p, t, l, a]

이는 가장 낮은 빈도의 요소를 먼저 획득하려는 기대와 일치합니다.

위 내용은 PriorityQueue.toString()이 PriorityQueue의 항목 순서를 정확하게 반영하지 않는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.