你可以有2個參數嗎?例如,我想添加一個字符串和一個相應的整數到一個優先鍵。然後,我將按整數對它進行排序。我知道如何添加一個字符串或整數,但我不知道如何添加兩個。有人能指點我正確的方向,並讓我知道,如果我甚至以這種正確的方式進行?Java中的優先級隊列
回答
如果你想使用多個元素作爲一個鍵,就可以創建一個封裝了一個類,然後使用該類型的關鍵。同樣的值。您應該使用此自定義密鑰類Comparable
,覆蓋equals()
,並覆蓋您創建的自定義密鑰類的hashCode()
。
如何創建一個包含這兩個字段(int
和String
),然後執行Comparable(在INT場比較)一新類。不要忘了還覆蓋hashCode()
和equals()
(見後面重寫這些方法的推理Comparable javadoc類別)。
是你所追求的?
能否請您討論爲什麼他應該重寫'equals()'(然後'hashCode()')?我會認爲實施「可比較」就足夠了。 – Catchwa 2010-10-25 02:49:41
請參閱類Javadoc可比爲什麼你想你可以看看我在這個問題上使用的PriorityQueue的重寫的equals()和hashCode() – NamshubWriter 2010-10-25 02:57:10
更新我的答案與參考的JavaDoc – 2010-10-25 03:31:22
有兩種方法可以做到這一點。無論哪種方式,您都希望創建一個既包含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);
我使用的BufferedReader閱讀來自用戶的輸入..所以他們把消息中,然後按下回車鍵後,再放入整數(先決)......現在,當我做queue.add(「串」)..但我需要添加他們。我該怎麼做? – Shonna 2010-10-25 03:15:19
我要去降序進行打印輸出字符串..但它的,我將使用做比較......這樣的整數,將需要連接到他們好歹進入 – Shonna 2010-10-25 03:16:38
你會做隊列中的字符串的整.add(新數據(消息,優先級)); – NamshubWriter 2010-10-25 03:17:10
這裏是做這件事的一般方法:
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;
}
}
}
- 1. 的Java:優先級隊列
- 2. 優先級隊列中的優先級
- 3. Java優先級隊列
- 4. java優先級隊列隊列適應
- 5. Java中對象的優先級隊列
- 6. 比較JAVA中的優先級隊列
- 7. 優先級隊列
- 8. Java鏈接列表優先級隊列
- 9. 如何將java優先級隊列轉換爲C++優先級隊列?
- 10. 實現Java的優先級隊列
- 11. Java中的優先隊列?
- 12. Java中的優先隊列
- 13. Java優先級隊列行爲怪異
- 14. 優先級隊列比較-java vs C++
- 15. Java優先級隊列接口實現
- 16. Java優先級隊列排序
- 17. PHP Sendmail隊列優先級
- 18. 雙重優先級隊列
- 19. Objective-c優先級隊列
- 20. 優先級隊列,可比
- 21. Amazon SQS優先級隊列
- 22. 關鍵 - 優先級隊列
- 23. 優先級隊列C
- 24. 樹和優先級隊列
- 25. 優先級隊列在python
- 26. 優先級隊列VS隊列
- 27. 在Java中出隊的優先級隊列問題
- 28. Java中基於級別通知的優先級隊列
- 29. C中的優先級隊列
- 30. Node.js中的請求優先級隊列
你能來看看我在這個問題上用一個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