【问题标题】:Passing Comparator to super constructor将比较器传递给超级构造函数
【发布时间】:2014-11-13 10:16:00
【问题描述】:

我需要使用 arraylist 在 java 中实现我自己的通用二进制堆。它需要支持最大堆和最小堆。这应该通过将 Comparator 传递给 BinaryHeap 构造函数来实现。

所以我猜这取决于传递的 Comparator 中的比较方法的作用,它是最小堆还是最大堆。我想我会做一个常规的 PQ(这是默认最小值),然后编写一个扩展 PQ 的 MaxPQ 类并将一个 Comparator 传递给超级构造函数。但是我需要在第一行调用super,所以我不知道在哪里初始化Comparator。有什么想法吗?

这是 MaxHeap 的代码:

import java.util.Comparator;

public class MaxHeap<Bid> extends BinaryHeap<Bid> {

    public MaxHeap(){

        MaxComp maxComp = new MaxComp();
        super(maxComp);

    }

}

class MaxComp implements Comparator<Bid>{
    public int compare(Bid a, Bid b){
        return (a.val - b.val);
    }

}

尝试了 Dmitrys 的建议 super(new MaxComp());,它产生了 "BinaryHeap&lt;Bid&gt;(MaxComp) is undefined"。这是带有 Comparator 的超级构造函数:

public class BinaryHeap<E>{

    private Comparator<? super E> comp;
    private ArrayList<E> array;

    private int last;   // index of last element

    public BinaryHeap(Comparator<? super E> comp){
        this.comp = comp;
        array = new ArrayList<E>();
    }  

【问题讨论】:

  • 请显示一些代码,以便更清楚您想要做什么,以及您想如何做。
  • 你说的PQ是什么意思?
  • PriorityQueue,以为它们基本上是同义词
  • 顺便说一句,不要使用MaxHeap&lt;Bid&gt; extends ...,而是使用MaxHeap extends ...,因为您已经指定了使用extends BinaryHeap&lt;Bid&gt; 的类型。我相信那是你的问题。
  • @Dmitry 我知道维基百科通常不是学术来源,但它冒犯地包含共同观点。 states for example队列是线性数据结构的一个例子,或者更抽象地说是一个顺序集合。当使用像“队列”这样的术语时,你不应该将它与实现细节混在一起来相应地重新定义它。

标签: java comparator


【解决方案1】:

只需像下面这样初始化它:

super(new MaxComp());

另外,不要使用MaxHeap&lt;Bid&gt; extends ...,而是使用MaxHeap extends ...,因为您已经指定了使用extends BinaryHeap&lt;Bid&gt; 的类型。这就是为什么你不能用你的Comparator 调用super 构造函数的原因。原因是使用了class MaxHeap&lt;Bid&gt; 中的泛型类型Bid 而不是实际的类Bid

【讨论】:

  • 谢谢,但它不起作用,我会再次编辑帖子
  • @BenjaminLindqvist“不起作用”的理由太笼统了。它到底在抱怨什么?
  • 现在编辑原帖
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-05-03
  • 2019-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多