2014-03-06 2 views
1
import java.util.*; 
class Priority{ 
public static void main(String args[]){ 

PriorityQueue<String> queue=new PriorityQueue<String>(); 
queue.add("Amit"); 
queue.add("Vijay"); 
queue.add("Karan"); 
queue.add("Jai"); 
queue.add("Rahul"); 

System.out.println("head:"+queue.element()); 
System.out.println("head:"+queue.peek()); 

System.out.println("iterating the queue elements:"); 
Iterator itr=queue.iterator(); 
while(itr.hasNext()){ 
System.out.println(itr.next()); 
} 

queue.remove(); 
queue.poll(); 

System.out.println("after removing two elements:"); 
Iterator itr2=queue.iterator(); 
while(itr2.hasNext()){ 
System.out.println(itr2.next()); 
} 

} 
} 

Output:head:Amit 
    head:Amit 
    iterating the queue elements: 
    Amit 
    Jai 
    Karan 
    Vijay 
    Rahul 
    after removing two elements: 
    Karan 
    Rahul 
    Vijay 

안녕하세요. 위의 그림과 같이 Java에서 컬렉션의 우선 순위를 배우려고했습니다. 이제 출력 때문에 정말 혼란 스럽습니다. 위의 그림과 같이 출력이 어떻게되는지 이해할 수 없습니다.PriorityQueue를 반복하면 순서가 지정된 결과가 생성되지 않습니다.

iterating the queue elements: 
    Amit 
    Jai 
    Karan 
    Vijay 
    Rahul 

비자이는 어떻게 rahul 앞에 왔습니까? 알파벳순으로 rahul이 vijay보다 먼저 나와야합니다.

누구나 프로그램 및 메소드 요소 내부에서 무슨 일이 일어나는지 설명 할 수 있습니까? 나는 그 방법을 찾을 수 없었다.

+0

질문의 제목을 'PriorityQueue를 통해 반복해도 순서가있는 결과가 나오지 않습니다'와 같이 변경하십시오. –

답변

2

PriorityQueue은 요소를 정렬 된 순서로 저장하지 않지만 정렬 된 순서로 요소를 가져올 수 있습니다. 머리에있는 요소가 그 요소에 사용 된 순서대로 가장 작은 요소인지 확인합니다.

따라서 여러 개의 숫자 - 2, 1, 4, 3, 6, 8을 저장하면 제거한 다음 요소는 1입니다. 그런 다음 1을 제거하면 2이 머리로 이동합니다. 나머지 요소의 순서에 대해서는 신경 쓰지 않습니다.

0

대부분의 경우 우선 순위 대기열은 heap datastructure을 사용하여 구현됩니다. 힙은 A가 B의 부모, 다음 < B

경우

그것은 다른 순서를 보장 나던 것을 보장하는 나무입니다. 로그 시간에 요소를 추가하고 로그 시간에 키를 제거하려면 일정 시간에 최소 요소를 제공하면 충분합니다.

이터레이터 itrpre-order transversal을 사용하여 힙을 탐색합니다.

Traverse(node) 
    visit(node) 
    Traverse(node.left()) 
    Traverse(node.right()) 

결과를 설명합니다.

참고 : 자바 <Comparable<T>

0

구현에 의해 제공되는이 질문은 Javadoc에 답변 :

) 방법 반복기 (제공 반복자의 우선 순위 큐의 요소를 통과하도록 보장되지
어떤 특정한 순서.

정렬 된 순서로 PQ를 트래버스하려면 remove() 메서드를 사용해야합니다.

관련 문제