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

从技术上讲,您在项目上使用可比较的接口,而不是数组。数组中的一项。我认为这里最好的解决方案是在构造函数中接受一个 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 回答