2011-04-22 88 views
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; 
    } 
} 

回答

0

如果我读这一权利,E只是需要延长Comparable,然后你的问题行成为...

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

这没有违反任何赌注做法规则,我知道的。

+0

当我在Comparable上扩展E时,我在构造函数 data =(E [])new Object [10]中得到了一个转换错误; [Ljava.lang.Object;不能转换为[Ljava.lang.Comparable; class HeapQueue > – Chad 2011-04-22 02:04:50

+0

@Char:只需改用ArrayList 即可。 – 2011-04-22 11:40:21

+0

我想出了铸造错误......我忘了将Object更改为类型Comparable。感谢您的帮助 – Chad 2011-04-22 17:00:13

1

技术上您在项目上使用可比较的接口,而不是数组。数组中的一个项目具体。我认为最好的解决方案是在构造函数中接受一个Comparator,用户可以通过它来比较其通用对象。

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

然后,你会是比较存储在一个成员函数,并使用

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

在地方的运营商相比少。

+0

我以前没有使用比较器,如何将它添加到构造函数中?谢谢 – Chad 2011-04-22 02:06:41

+0

在示例中编辑 – Ben 2011-04-22 02:09:51