泛型堆中的比较运算符

时间:2011-04-22 01:19:44

标签: java heap

对于我的数据结构类,我们的功课是创建一个通用的堆ADT。在siftUp()方法中,我需要进行比较,如果父级更小,我需要进行交换。我遇到的问题是比较运算符在泛型类型上无效。我相信我需要使用Comparable接口,但从我读到的内容来看,使用Arrays并不是一个好主意。我也搜索了这个网站,我发现了与这个帖子有关的好信息,没有一个帮助我找到解决方案

我删除了一些不相关的代码 感谢

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

2 个答案:

答案 0 :(得分:1)

从技术上讲,你在on item上使用的是类似的接口,而不是数组。阵列中的一个项目具体。我认为这里最好的解决方案是在构造函数中接受用户可以传递以比较其通用对象的Comparator。

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

然后,您将该比较器存储在成员函数中并使用

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

取代小于运营商。

答案 1 :(得分:0)

如果我正确阅读,E只需要延长Comparable,然后你的问题就变成......

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

这并没有打破我所知道的任何赌注练习规则。