2016-10-01 42 views
0

我在爲數據結構類分配時遇到了很多麻煩。我需要使用雙向鏈表實現一個雙端優先級隊列,但我的教授提供的用於測試它的代碼中有一些奇怪的東西。我不明白的部分是爲什麼他使用DoubleEndedPriorityQueue,但添加了對象而不是整數。我得到的錯誤是沒有方法添加(對象),這是真的。通用雙端優先級隊列的問題

public class Test1ForAssign2 { 
public static void main(final String[] args) { 

final DoubleEndedPriorityQueue<Integer> sampleL = (DoubleEndedPriorityQueue<Integer>)new ListDoubleEndedPriorityQueue(); 

sampleL.add((Object)5); 
sampleL.add((Object)12); 
sampleL.add((Object)5); 
sampleL.add((Object)1); 
sampleL.add((Object)(-7)); 
sampleL.add((Object)3); 
System.out.println("Priority Queue Contents: "); 
System.out.println("Deleting: " + sampleL.deleteMin()); 
System.out.println("Deleting: " + sampleL.deleteMax()); 
} 

public interface DoubleEndedPriorityQueue<AnyType>{ 
void makeEmpty (); 
void add (AnyType x); 
AnyType deleteMin (); 
AnyType deleteMax (); 
AnyType findMin (); 
AnyType findMax (); 
boolean isEmpty (); 
} 

回答

0

正如你所說的,這個代碼目前不會編譯 - 你需要要麼使sampleLDoubleEndedPriorityQueue<Object>,或鑄整數而不是整數

sampleL.add((Integer)5); 

還有一種更好的方式拿到包裝類型:

sampleL.add(Integer.valueOf(5)); 

我覺得這裏的意圖可能是爲了避免隱性自動裝箱 - java會包裝和原始類型之間的自動轉換,但明確表達這一點很好。特別是在泛型方面,這可能會讓人感到困惑,並且(特別是在學習時)不依賴這些快捷方式是很好的。

+0

謝謝@ hugh這就是我的想法。順便說一句,你可以幫助我用別的東西嗎?他也給了我們這個代碼: private Comparator <?超級AnyType> cmp; 私有節點 first = null; 私有節點 last = null; 但我不知道如何使用比較器,我一直試圖做cmp.compare(obj1,obj2),但它總是給我一個零點異常,我敢肯定,這兩個對象都不爲空。我認爲這是因爲Integer類沒有實現比較器,但是他如何期望我們這樣做呢? –

+0

(通常在一個地方發佈幾個問題是不好的做法,但我會嘗試給出一些指針)Integer不實現Comparator,但它確實實現了Comparable - 如果您搜索那些應該能夠查找文章的人這些如何不同。如果其中任何一個參數爲null,'compare'可以拋出NPE,否則聽起來像'compare'中的代碼不正確(可能使用不帶空值檢查的可空字段)。你在使用調試器嗎?使用一個會使你的生活*變得更好。 – hugh