2011-11-09 1 views
1

PriorityQueue에있는 항목의 우선 순위를 높이거나 낮추고 싶습니다. 예를 들어 긴 목록의 이미지를 다운로드하고 30 번째 우선 순위를 갑자기 올릴 수 있습니다.PriorityQueue는 이미 큐에있는 요소를 재정렬 할 수 있습니까?

필자가 알고 있듯이 poll()은 (비교 자에 의해 결정된) 가장 낮은 값을 가진 큐 개체를 항상 반환합니다. 이미 큐에있는 항목의 값을 낮출 수 있다면 (예 :이 값이 객체의 int에 의해 결정되고 다른 함수에서 int 값을 줄이는 경우), 먼저 poll()에 의해 반환되거나 정렬 poll()이 삽입 시간에 완료되도록 할 수 있습니다 (예 : 새로운 대기열 요소가 자연적인 깊이에 도달 할 때까지 목록 아래로 버블 링).

PriorityBlockingQueue에서이 작업을 수행하면 동시성 문제가 발생할 수 있습니까?

답변

6

순서를 결정하는 속성을 변경하면 Java 컬렉션의 요소 중 자동으로 요소 순서가 변경되지 않습니다. .hashCode(),. equals() 또는 일부 비교 자에 의존하는 컬렉션의 경우 해시 코드/같음 또는 비교자가 다른 값을 생성하도록 컬렉션에있는 동안 개체를 변경할 수 없습니다.

PriorityQueue에서 우선 순위를 변경하려면 객체를 제거, 변경, 다시 삽입해야합니다.

2

소스 코드를 보면, 당신이 PriorityQueue에이 resifts poll() 때마다,하지만 항상 는 SIFT 전에 상단에이었다 항목을 반환합니다. 당신이 우선 순위 큐를 반복하는 경우

public class PQ { 

    int priority; 

    public PQ(int priority) { 
    this.priority = priority; 
    } 

    public static void main(String[] args) { 

    PQ one = new PQ(1); 
    PQ two = new PQ(2); 
    PQ three = new PQ(3); 
    PQ four = new PQ(4); 
    PQ five = new PQ(5); 

    PriorityQueue<PQ> q = new PriorityQueue<PQ>(3, new Comparator<PQ>() { 
     @Override 
     public int compare(PQ o1, PQ o2) { 
     return o1.priority-o2.priority; 
     } 
    }); 

    q.add(three); 
    q.add(one); 
    q.add(four); 
    q.add(two); 
    q.add(five); 

    //Prints; 
    //PQ-1 
    //PQ-2 
    //PQ-3 
    //PQ-4 
    //PQ-5 
    while (!q.isEmpty()) { 
     System.out.println(q.poll()); 
    } 

    q.add(three); 
    q.add(one); 
    q.add(four); 
    q.add(two); 
    q.add(five); 

    //Change the priority after it has been queued 
    four.priority = 10; 

    //Prints; 
    //PQ-1 
    //PQ-2 
    //PQ-3 
    //PQ-5 
    //PQ-10 
    while (!q.isEmpty()) { 
     System.out.println(q.poll()); 
    } 

    //Reset the priority 
    four.priority = 4; 

    q.add(three); 
    q.add(one); 
    q.add(four); 
    q.add(two); 
    q.add(five); 

    //Change the priority after it has been queued 
    four.priority = 0; 

    //Prints; 
    //PQ-1 
    //PQ-0 
    //PQ-2 
    //PQ-3 
    //PQ-5 
    while (!q.isEmpty()) { 
     System.out.println(q.poll()); 
    } 
    } 

    public String toString() { 
    return "PQ-" + priority; 
    } 

} 
+0

흥미 롭습니다. 내가 기대했던 것만 큼 좋지는 않았지만, 내가 두려워했던 것보다 낫다. –

0

, 당신은 당신이 다른 우선 순위 큐를 만들 제안, 당신이 순서를 변경하고자하는 경우는 (첫 번째 요소는 제외) 특별한 순서입니다 찾을 수 있습니다.

한 항목의 위치를 ​​변경하려면 제거한 다음 필요에 따라 입력란을 변경하고 다시 추가하는 것이 좋습니다.

+0

나는 반복에 대해 말하는 게 아니다. 나는'PriorityQueue' ** 이벤트가 큐에 추가 된 후에 ** 이벤트를 정렬하는데 사용 된 값을 변경하는 것이'poll()'에 의해 검색된 순서를 바꿀 수 있는지에 대해 말하고 있습니다. 나는 이미 StackOverflow에서'PriorityQueue'를 반복하는 것에 관한 다른 글을 읽었습니다. –

+1

값이 대기열의 맨 위에 있지 않으면 오류가 발생할 수 있습니다. 이모, Comparator, equals 및 hashCode 메서드에서만 최종 필드를 사용해야합니다. 그렇지 않으면 문제가 있는지 묻습니다. –

+0

그게 합의 인 것처럼 보이지만 이것에 대해 고마워요. 큐를 정적으로 유지하려면 확실히 final을 사용할 것입니다.하지만 큐에서 원하는대로 우선 순위를 변경할 수있게하고 싶습니다. 그것이 일어나는 것에 따라, 이것은 그것을 달성하는 방법이 아닐지도 모른다. 그러나 헤이 :) –

관련 문제