2010-10-25 235 views
3

你可以有2個參數嗎?例如,我想添加一個字符串和一個相應的整數到一個優先鍵。然後,我將按整數對它進行排序。我知道如何添加一個字符串或整數,但我不知道如何添加兩個。有人能指點我正確的方向,並讓我知道,如果我甚至以這種正確的方式進行?Java中的優先級隊列

回答

2

如果你想使用多個元素作爲一個鍵,就可以創建一個封裝了一個類,然後使用該類型的關鍵。同樣的值。您應該使用此自定義密鑰類Comparable,覆蓋equals(),並覆蓋您創建的自定義密鑰類的hashCode()

+0

你能來看看我在這個問題上用一個PriorityQueue的? http://stackoverflow.com/questions/28800287/how-to-restore-the-priorityqueue-to-its-initial-state-before-the-method-call?noredirect=1#comment45875800_28800287 – committedandroider 2015-03-02 00:41:52

3

如何創建一個包含這兩個字段(intString),然後執行Comparable(在INT場比較)一新類。不要忘了還覆蓋hashCode()equals()(見後面重寫這些方法的推理Comparable javadoc類別)。

是你所追求的?

+0

能否請您討論爲什麼他應該重寫'equals()'(然後'hashCode()')?我會認爲實施「可比較」就足夠了。 – Catchwa 2010-10-25 02:49:41

+0

請參閱類Javadoc可比爲什麼你想你可以看看我在這個問題上使用的PriorityQueue的重寫的equals()和hashCode() – NamshubWriter 2010-10-25 02:57:10

+0

更新我的答案與參考的JavaDoc – 2010-10-25 03:31:22

12

有兩種方法可以做到這一點。無論哪種方式,您都希望創建一個既包含String(所需值)又包含整數(優先級)的自定義對象。

第一個解決方案是有此數據對象實現Comparable

class Data implements Comparable<Data> { 
    private final String message; 
    private final int priority; 

    public Data(String message, int priority) { 
    this.message = message; 
    this.priority = priority; 
    } 

    @Override 
    int compareTo(Data other) { 
    return Integer.valueOf(priority).compareTo(other.priority); 
    } 

    // also implement equals() and hashCode() 
} 

然後當你做

PriorityQueue<Data> queue = new PriorityQueue<Data>(); 

隊列將責令由compareTo方法定義的訂單項目。

這種解決方案的問題是,如果你想排序是僅在整數,然後要麼equals方法和你compareTo方法不會是一致的或者你equals方法是不正確的。

一個更好的解決辦法是使用PriorityQueue構造函數,一個Comparator。在這種情況下,Data將不必執行Comparable;你只需要一個Comparator定義您的訂購:

public final class OrderDataByPriority implements Comparator<Data> { 
    public static final OrderDataByPriority INSTANCE = new OrderDataByPriority(); 

    private OrderDataByPriority() {} 

    @Override 
    public int compare(Data data1, Data data2) { 
    return Integer.valueOf(data1.priority).compareTo(data2.priority); 
    } 

    @Override 
    public boolean equals(Object other) { 
    return other == OrderDataByInteger.INSTANCE; 
    } 

    private Object readResolve() { 
    return INSTANCE; 
    } 
} 

注意,因爲這比較不帶任何數據,我做了一個單例。

然後,您可以創建隊列行這樣的:

PriorityQueue<Data> queue = new PriorityQueue<Data>(
    initialCapacity, OrderDataByPrority.INSTANCE); 
+0

我使用的BufferedReader閱讀來自用戶的輸入..所以他們把消息中,然後按下回車鍵後,再放入整數(先決)......現在,當我做queue.add(「串」)..但我需要添加他們。我該怎麼做? – Shonna 2010-10-25 03:15:19

+0

我要去降序進行打印輸出字符串..但它的,我將使用做比較......這樣的整數,將需要連接到他們好歹進入 – Shonna 2010-10-25 03:16:38

+0

你會做隊列中的字符串的整.add(新數據(消息,優先級)); – NamshubWriter 2010-10-25 03:17:10

4

這裏是做這件事的一般方法:

public class PriorityQueue<T> { 

    private java.util.PriorityQueue<IntPriorityComparableWrapper<T>> queue; 

    public PriorityQueue() { 
      queue = new java.util.PriorityQueue<IntPriorityComparableWrapper<T>>(); 
    } 

    public void add(int priority, T object) { 
      queue.add(new IntPriorityComparableWrapper<T>(object, priority)); 
    } 

    public T get() { 
      return (null != queue.peek())? queue.poll().getObject() : null; 
    } 


    /** 
    * A "wrapper" to impose comparable properties on any object placed in the 
    * queue. 
    */ 
    private static class IntPriorityComparableWrapper<T> 
    implements Comparable<IntPriorityComparableWrapper<T>> { 

      private T object; 
      private int priority; 

      public IntPriorityComparableWrapper(T object, int priority) { 
        this.object = object; 
        this.priority = priority; 
      } 

      public int compareTo(IntPriorityComparableWrapper<T> anotherObject) { 
        return this.priority - anotherObject.priority; 
      } 

      public int getPriority() { 
        return priority; 
      } 

      public T getObject() { 
        return object; 
      } 
    } 

}