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 중국어 웹사이트의 기타 관련 기사를 참조하세요!