2017-09-20 93 views
0

在此程序中,我使用Java中的Array列表創建堆優先級隊列。 我會盡量保持代碼不變,以幫助更輕鬆地解決問題。無法找到符號/無法將對象轉換爲可比較的使用ArrayList中的泛型

本質上,我已經爲heapAPI定義了一個接口並在Heap類中實現它。堆構造函數應該通過定義對象的數組列表來構造堆對象。在這裏,我想傳遞PCB類的對象(作業進入優先級隊列)。但是,當我傳遞這些對象時,我無法通過數組列表訪問它們。

下面的附件是HeapAPI,堆類和PCB類的代碼。

HeapAPI.java

public interface HeapAPI<E extends Comparable<E>> 
{ 
    boolean isEmpty(); 
    void insert(E item); 
    E remove() throws HeapException; 
    E peek() throws HeapException; 
    int size(); 
} 

Heap.java

public class Heap<E extends Comparable<E>> implements HeapAPI<E> 
{ 
    private ArrayList<E> tree; 

    public Heap() 
    { 
      tree = new ArrayList<>(); 
    } 

// don't believe the rest of the class is necessary to show 
} 

PCB.java

public class PCB implements Comparable<PCB> 
{ 
    private int priority; 

    // various private variables 

    public PCB() 
    { 
     priority = 19; 
     // instantiated variables 
    } 

    // don't believe the rest of the code is necessary 
    // the one specific function of PCB I use follows 

    public int getPriority() 
    { 
      return priority; 
    } 
} 

我曾嘗試以下方法主要通過該ArrayList調用PCB對象的功能將PCB對象插入Heap對象的數組列表後。

Main.java

public class Main 
{ 
    public static void main(String[] args) throws HeapException 
    { 
      Heap temp = new Heap(); 
      PCB block = new PCB(); 
      PCB block1 = new PCB(); 
      PCB block2 = new PCB(); 

      temp.insert(block); 
      temp.insert(block1); 
      temp.insert(block2); 

      block.getPriority(); 

      // does not work 
      int num = temp.peek().getPriority(); 
      //does not work 
      num = temp.get(0).getPriority(); 
} 

我得到該程序無法找到符號的錯誤:方法getPriority()。

[另外,import java.util.ArrayList;被稱爲在每個文件中]

我一直在嘗試學習和應用泛型的熱門分鐘,但我現在只是卡住了。

如果我不清楚任何事情,我可以輕鬆添加更多代碼或澄清問題。

任何幫助表示讚賞。

謝謝!

+0

請注意,除非PCB被認爲具有「自然」排序(我不認爲他們這樣做,如果PCB意味着「印刷電路板」)。相反,'PCB'不應該實現'Comparable ',並且'HeapAPI'不需要被限制爲'Comparable'類型;而是可以向'HeapAPI'的實現者的構造函數提供'Comparator ',它允許它對元素進行排序。 [很多關於此的問題/回答](https://stackoverflow.com/questions/4108604/java-comparable-vs-comparator)。 –

回答

2

這裏的問題:

Heap temp = new Heap(); 

你有一個通用的Heap類,但在這裏,你都沒有它的仿製藥創建它。這是Raw Types的一個例子。

喜歡的東西:

Heap<PCB> temp = new Heap<>(); 

應該工作。

+0

完美無瑕地工作。也完全感覺。感謝您指出了這一點。 – boppa

2

你堆聲明改爲

Heap<PCB> temp = new Heap<>(); 

現在你的編譯器知道堆包含PCB對象等它期待媲美返回不具有getPriority()方法。

+0

再次,工作完美無瑕。也完全感覺。感謝您指出這一點...... – boppa

+0

@boppa注意,您將被警告:無論是通過命令行的javac,還是通過您的IDE。注意你的編譯器,它可以幫助你! –

相關問題