普林斯顿大学算法课程二进制堆程序中可比接口(Java)的实现
我不使用广泛的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
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
vsimplements
,但在泛型类型声明中仅使用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();