PriorityQueue 정렬되었지만 가장 큰 두 개 [중복]

Nov 25 2020
public class Pair implements Comparable<Pair>{
    public String name;
    public int number;

    public int compareTo(Pair other) {
        if (other == null) {
            return 1;
        }
        return Integer.compare(number, other.number);
    }
}
ht = new Hashtable<String, Pair>(perLen);
PriorityQueue<Pair> pq = new PriorityQueue<Pair>(k);
set = ht.keySet();
for (String i: set) {
        tmp0 = ht.get(i);
        if (tmp0.compareTo(pq.peek()) > 0) {
            if (pq.size() == k) {
                pq.remove();
            }
            pq.add(tmp0);
        }
}
System.out.println(pq.toString());

산출:

[OSCAR 822, ALBERTO 827, DAVID 1523, JAVIER 943]

해시 테이블에서 k 개의 가장 큰 쌍 (그들의 번호)을 찾고 있는데 출력에있는 쌍은 실제로 올바른 쌍입니다. 내 질문은 왜 마지막 두 개가 바뀌 었습니까?

답변

2 fps Nov 25 2020 at 11:38

PriorityQueue머리에서 가장 낮은 요소 만 반환합니다. 모든 요소를 ​​정렬하지 않으므로를 사용하여 대기열을 순회하면 pq.toString()요소가 순서대로 나타나지 않을 수 있습니다. 이것은 내부적으로 문서에 따르면 메서드를 PriorityQueue.toString()사용 하기 때문에 발생합니다 PriorityQueue.iterator().

메서드에 제공된 Iterator iterator()는 특정 순서로 우선 순위 큐의 요소를 순회하는 것이 보장 되지 않습니다 . 정렬 된 순회가 필요한 경우 Arrays.sort(pq.toArray()).

우선 순위 큐의 요소를 순서대로 인쇄하려면 다음 코드를 변경해야합니다.

System.out.println(pq.toString());

다음에 :

while (!pq.isEmpty()) 
    System.out.println(pq.remove());
1 BrightSoul Nov 25 2020 at 11:32

PriorityQueue 클래스의 toString () 메서드는 반복기를 사용하므로 요소의 순서를 보장하지 않습니다.

Ashish Nov 25 2020 at 11:28

다음과 같이 poll 방법을 사용하여 주문을 확인할 수 있습니다.

우선 순위 큐의 내용 인쇄 [java]