2017-09-20 1 views
0

このプログラムでは、Javaでarraylistsを使用してヒープ優先順位キューを作成しています。 問題を簡単に解決するためにコードを裸にしておきます。シンボルを見つけることができません/ジェネリックでArrayListを使用してオブジェクトを比較可能に変換できません

本質的に、私はheapAPIのインタフェースを定義し、それをHeapクラスに実装しました。ヒープコンストラクタは、オブジェクトのarraylistを定義することによってヒープオブジェクトを構築することになっています。ここでは、PCBクラスのオブジェクト(優先キューに入るジョブ)を渡したいと思います。しかし、私はこれらのオブジェクトを渡すと、私はarraylistを通じてそれらにアクセスすることはできません。

以下に、HeapAPI、Heapクラス、および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 
} 

私はArrayListを介してPCBオブジェクトの関数を呼び出すために、次の主な方法を試みた

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; 
    } 
} 

PCB.java HeapオブジェクトのarraylistにPCBオブジェクトを挿入した後

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を()。

[また、java.util.ArrayListをインポートします。各ファイルで呼び出されます]

私は熱い瞬間にジェネリックスを学び、適用しようとしていましたが、今は固執しています。

私は何かが不明な場合は、簡単にコードを追加したり、問題を明確にすることができます。

ご協力いただければ幸いです。

ありがとうございます!

+0

PCBが「自然な」順序付けをしているとみなされない限り(そして、PCBは「プリント回路基板」を意味するとは思わない)。代わりに 'PCB'は' Comparable 'を実装するべきではなく、' HeapAPI'は 'Comparable'型に制約する必要はありません。 'HeapAPI'の実装者のコンストラクタに' Comparator 'を提供して、要素をソートすることができます。 [これに関するたくさんの質問/回答](https://stackoverflow.com/questions/4108604/java-comparable-vs-comparator) –

答えて

2

は、ここで問題です。これはRaw Typesの例です。

ような何か

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

が動作するはずです。

+0

完璧に働いた。完全な意味合いも作ります。これを指摘してくれてありがとう。 – boppa

2
今、あなたのコンパイラがヒープは、それがgetPriority()メソッドを持たない返すに匹敵期待している他のPCBのオブジェクトが含まれていることを知っている

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

にあなたのヒープの宣言を変更

。あなたは一般的なHeapクラスを持っているが、ここであなたはそのジェネリックせずに、それを作成している

Heap temp = new Heap(); 

+0

再び、完璧に働いた。完全な意味合いも作ります。これを指摘してくれてありがとう... – boppa

+0

@boppaは、これについて警告されていることに注意してください:コマンドライン上のjavacかIDEか。あなたのコンパイラに注意してください、あなたを助けるためにそこにあります! –

関連する問題