2013-02-06 3 views
6

어리석은 것처럼 들릴지 모르지만, (키, 값) 쌍의 객체가 있고 키에 따라 정렬 할 때 의미가 있습니다. 내 요점을 설명하기 위해 :Java의 PriorityQueue가 중복 항목을 정렬하는 방법은 무엇입니까?

public class Pair implements Comparable<Pair> { 
    private int value; 
    private int key; 

    public Pair(int key, int value) { 
     this.key = key; 
     this.value = value; 
    } 

    @Override 
    public int compareTo(Pair o) { 
     if (this.key > o.key) 
      return 1; 
     else if (this.key < o.key) 
      return -1; 
     return 0; 
    } 
} 

public class program { 
    public static void main(String[] args) { 
     PriorityQueue<Pair> queue = new PriorityQueue<Pair>; 
     queue.add(new Pair(1,1)); 
     queue.add(new Pair(1,2)); 
     queue.add(new Pair(1,3)); 

     Pair pair = queue.poll(); // What would be in pair? 
    } 
} 

무엇이 pair에 있을까요? 첫 번째 또는 마지막으로 추가 된 요소? 아니면 결정할 가능성이없는 그들 중 누구입니까?

답변

7

PriorityQueue 인 API는이 상황에 대해 아무런 약속도하지 않습니다이 큐의

머리가 지정된 순서에 대한 최소한의 요소입니다. 여러 요소가 최소값으로 묶여 있다면 머리는 해당 요소 중 하나입니다. 관계는 임의로 끊어집니다. 대기열 검색 작업 poll, remove, peek 및 요소는 대기열의 헤드에서 요소에 액세스합니다.

하지만 쉽게 테스트 할 수 있습니다. 설문 조사 결과를 toString이

@Override 
public String toString() { 
    return key + " " + value; 
} 

페어링 추가 인쇄

Pair pair = queue.poll(); // What would be in pair? 
    System.out.println(pair); 

1 1 
+1

+1. –

+1

그래서 제대로 이해한다면 - 내가 먼저 얻는 가치가 무엇인지에 의존 할 수는 없습니까? 출력에서 실제로 "FIFO"동작을하는 것처럼 보입니다. – Petr

+1

API에 따르면 할 수는 없지만 내 테스트에서는 동일한 Pair.key에 대해 FIFO와 비슷한 동작이 표시됩니다. –

-3

기본적으로 Queue은 firstInfirstOut 데이터 구조입니다.

PriorityQueue에서 comparable -ity는 순서를 정의합니다.

귀하의 경우와 마찬가지로 모든 우선 순위는 Pair()입니다. 따라서 순서가 바뀌지 않습니다.

선입 선출 큐의 선두의 요소를 제거 PEEK, 소자 접속 Pairs (1,1) (1,2) (1,3)

로서 documentation

큐 취득 조작 조사마다 .

+0

이 코멘트를 downvote 뒤에 더 나은, 난 아무 잘못 – TheWhiteRabbit

+3

대답없는 볼 것 인쇄 올바르지 않습니다. 순서는 불확정하다. 유일한 정답은 – EJP

관련 문제