0

私のデータ構造クラスの宿題は、汎用ヒープ ADT を作成することです。siftUp() メソッドでは比較を行う必要があり、親が小さい場合はスワップを行う必要があります。私が抱えている問題は、ジェネリック型では比較演算子が有効でないことです。Comparable インターフェースを使用する必要があると思いますが、私が読んだことから、配列で使用するのは良い考えではありません。このサイトも検索しましたが、この投稿に関連する良い情報を見つけましたが、解決策を見つけるのに役立ちませんでした

関係のないコードの一部を削除しました ありがとう

public class HeapQueue<E> implements Cloneable  {   
  private int highest;
  private Integer manyItems;
  private E[] data; 

  public HeapQueue(int a_highest) {
      data = (E[]) new Object[10];
      highest = a_highest;

  } 

  public void add(E item, int priority) {
      // check to see is priority value is within range
      if(priority < 0 || priority > highest) {
        throw new IllegalArgumentException
          ("Priority value is out of range: " + priority);
      }     
      // increase the heaps capacity if array is out of space
      if(manyItems == data.length)
        ensureCapacity();
      manyItems++;
      data[manyItems - 1] = item;
      siftUp(manyItems - 1);
  }

  private void siftUp(int nodeIndex) {
      int parentIndex;
      E tmp;
       if (nodeIndex != 0) {
            parentIndex = parent(nodeIndex);
            if (data[parentIndex] < data[nodeIndex]) {  <-- problem ****
                  tmp = data[parentIndex];
                  data[parentIndex] = data[nodeIndex];
                  data[nodeIndex] = tmp;
                  siftUp(parentIndex);
            }
        }
      } 

  private int parent(int nodeIndex) {
      return (nodeIndex - 1) / 2;
  }
}
4

2 に答える 2

1

技術的には、配列ではなくアイテムの同等のインターフェイスを使用しています。具体的には、配列内の 1 つの項目。ここでの最善の解決策は、コンストラクターで、ユーザーが汎用オブジェクトを比較するために渡すことができる Comparator を受け入れることだと思います。

Comparator<E> comparator;
public HeapQueue(int a_highest, Comparator<E> compare)
{
    this.comparator = compare;

次に、そのコンパレータをメンバー関数に格納して使用します

if (comparator.compare(data[parentIndex],data[nodeIndex]) < 0)  

小なり演算子の代わりに。

于 2011-04-22T01:35:31.967 に答える
0

私がこれを正しく読んでいる場合、 E は単純にComparableを拡張する必要があり、問題の行は...

if (data[parentIndex].compareTo(ata[nodeIndex]) < 0)

これは、私が知っている賭けのルールに違反するものではありません。

于 2011-04-22T01:38:05.020 に答える