2013-02-06 49 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使得任何承諾爲這樣的情況:

這個隊列的頭是相對於指定的排序的最小元素。如果多個元素的價值最小,那麼頭是其中一個元素 - 領帶被任意破壞。隊列檢索操作輪詢,刪除,查看和元素訪問隊列頭部的元素。

但它很容易測試。添加的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()的優先級都是相同的。因此沒有改變的順序。

先入先出Pairs (1,1) (1,2) (1,3)

作爲每documentation

隊列檢索操作投票,取出,PEEK和元素訪問 元素在隊列的頭部。

+0

它會是更好的評論之後downvote,我看不出有什麼錯 – TheWhiteRabbit

+3

答案是不正確。該訂單是不確定的。 – EJP

相關問題