Princeton Univeristy在算法课程中的二进制堆程序中可比接口(Java)的实现

时间:2018-07-24 11:27:42

标签: java algorithm interface comparable binary-heap

我不使用广泛的Java进行编程,因此仅具有有关该语言的基本知识。我在做an algorithm course on coursera

本课程中给出的二进制堆程序是:

public class MaxPQ<Key extends Comparable<Key>>
{
    private Key[] pq;
    private int N;


    public MaxPQ(int capacity)
    { pq = (Key[]) new Comparable(capacity + 1);
    }
    public boolean isEmpty()
    { return N==0;}
    public void insert(Key key)
    { pq[++N] = x;
      swim(N);}
    private void swim(int k)
    {  while(k>1 && less(k/2,k))
       {
            exch(k,k/2);
            k=k/2;
       }
    }
    public key delMax()
    {
         Key max = pq[1];
         exch(1,N--);
         sink(1);
         pq[N+1] = null; //To prevent loitering.
         return max;
    }
    private void sink(int k)
    {
         while(2*k<=N){
            int j= 2*k;
            if(j<N && less(j,j+1))j++;
            if(!less(k,j)) break;
            exch(k,j);
            k=j;}
    }
    private boolean less(int i, int j)
    { return pq[i].compareTo(pq[j])>0; }
    private void exch(int i, int j)
    { Key t = pq[i]; pq[i] = pq[j]; pq[j] = t; }

compareTo()方法将在Key类的定义中定义,当它在可比较的接口中覆盖默认方法compareTo时。

现在,我知道可比对象是java.lang中的内置接口。 在定义MaxPQ类时,使用的通用类型是:

public class MaxPQ < Key extends Comparable < Key > >

由于Comparable是一个接口,而Key扩展了该接口,这意味着key也必须是一个接口。

现在我不明白这是如何工作的。

有人可以向我解释一下,如果接口充当泛型类型将有什么用,以及为什么Key需要扩展Comparable<Key>

如果您还可以给我一个示例,说明如何定义Key(使用Comparable接口),将非常有帮助。

2 个答案:

答案 0 :(得分:1)

Key extends Comparable < Key >仅意味着Key实现了接口Comparable < Key >。没什么。

答案 1 :(得分:0)

您缺少的是了解

<Key extends Comparable<Key>>

这并不意味着Key是接口...这意味着Key是Comparable的子类,可以这样对待。

Comparable<Key> c = new Key();

最后,Key是否实现Comparable接口或扩展Comparable类并不重要,因为在两种情况下,它都可以充当Comparable-并具有Comparable拥有的方法。