Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
普林斯顿大学算法课程二进制堆程序中可比接口(Java)的实现_Java_Algorithm_Interface_Comparable_Binary Heap - Fatal编程技术网

普林斯顿大学算法课程二进制堆程序中可比接口(Java)的实现

普林斯顿大学算法课程二进制堆程序中可比接口(Java)的实现,java,algorithm,interface,comparable,binary-heap,Java,Algorithm,Interface,Comparable,Binary Heap,我不使用广泛的Java进行编程,因此我只了解该语言的基本知识。我正在做 本课程中给出的二进制堆程序是: public class MaxPQ<Key extends Comparable<Key>> { private Key[] pq; private int N; public MaxPQ(int capacity) { pq = (Key[]) new Comparable(capacity + 1); } pub

我不使用广泛的Java进行编程,因此我只了解该语言的基本知识。我正在做

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

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; }
由于
Comparable
是一个接口,
Key
扩展了该接口,这意味着
Key
也必须是一个接口

现在我不明白这是怎么回事

有人能给我解释一下,如果一个接口作为一个通用类型,它会有什么好处,为什么
Key
需要扩展
Comparable


如果您还可以给我一个示例,说明如何定义
(使用
可比较的
接口)。

键扩展可比较的
仅意味着
实现接口
可比较的
。没什么了。

你缺少的是理解

<Key extends Comparable<Key>>

这并不意味着关键是接口。。。这意味着Key是Comparable的一个子类,可以这样处理

Comparable<Key> c = new Key();
可比c=新键();

最后,Key实现的接口是Comparable,还是扩展的类是Comparable,都无关紧要,因为在这两种情况下,它都可以充当Comparable,并且具有Comparable所具有的方法。

只需使用
Integer
就可以获得的tryPossible副本。在这种情况下,我们不必使用关键字“implements”来代替extends吗,我同意语法可能有误导性,但事实就是如此。在类声明中使用
extends
vs
implements
,但在泛型类型声明中仅使用
extends
。可能是因为如果您有一个更通用的案例,比如
U扩展V
,其中
V
本身是我们不太了解的其他泛型类型,那么很难区分接口
V
和类
V
。换句话说,
扩展
更“通用”;)这并不能回答这个问题。若要评论或要求作者澄清,请在其帖子下方留下评论。-@SRack您能详细说明为什么这不是OP问题的答案吗?OP写道:“由于Comparable是一个接口,而Key扩展了该接口,这意味着Key也必须是一个接口。现在我不明白它是如何工作的。”。很明显,我的回答所针对的OP方面存在误解。问题的其余部分基于一个错误的前提,例如:“作为泛型类型,接口有什么好处,为什么键需要扩展Comparable”和“如何定义键(使用Comparable interface)”,这变得毫无意义。同样,如果这个答案正确与否,我想补充一个事实,错误的答案不应该被标记和删除为NAA,而是被否决。以任何标准来看,这都是一个答案。对还是错?评估不是评审员的工作。-好的,如果Key是Comparable的子类,这意味着Comparable是一个用户定义的类,而不是java.lang中预定义的Comparable接口。你是这么说的吗?这个答案说key也是一个接口。
key
是实现
java.lang.Comparable
的某种类型。我认为你所引用的答案是误导性的。我认为他们在回答中的意思是,你可以将
Key
视为
Comparable
或其他扩展它的接口。虽然在实例化
MaxPQ
时,您可以传递
compariable
的子类型的任何类型。简言之,这个答案(stackoverflow.com/a/12659729/5961353)非常糟糕。我同意@ciamej的观点-这个答案是误导性的。我猜我的也是,并没有什么可以阻止你们将接口作为参数传递(当然不是从编译器的角度),我的主要观点是扩展并不意味着键就是一个接口。
Comparable<Key> c = new Key();