如何使用比较器实现这两个堆构造函数?



我以前从未使用过比较器,我正在努力掌握这个概念,以便将其实现为堆。特别是我在网上找不到任何涉及到比较器和堆在一起。据我所知,以下是您需要的代码。如果还需要什么,请告诉我。谢谢。

//A complete tree stored in an array list representing this binary heap
private ArrayList<E> tree;
// A comparator lambda function that compares two elements of this heap when rebuilding it
private Constructor<? super E> cmp;
// constructs an empty heap using the compareTo method of its data type  as the comparator
public Heap () {
}
// A parameterized constructor that uses an externally defined comparator

// @param fn - a trichotomous integer value comparator function
public Heap(Comparator<? super E> fn) {
}

如果我错了请纠正我,但是为了使用比较器,您将需要compareTo方法,这是一种自然的比较方法。这个compareTo方法属于Car类,你可以在下面找到关于它的信息。下面是compareTo方法:

public int CompareTo(Car c) {

if (year != c.year) 
return year - c.year; 
if(make.compareTo(c.make) != 0) 
return make.compareTo(c.make); 
if(make.compareTo(c.model) != 0) 
return model.compareTo(c.model);
return type.compareTo(c.type);

您可能需要也可能不需要这些信息来帮助我实现这两个堆构造函数:

我试图做的总体目标是实现main方法,该方法接受数据文件的名称和表示排序键的数字代码(或使用堆对数据进行排序的顺序)。然后生成数据的排序列表。在这个特定的例子中,我对以下订单排序汽车代码:

-2 (-make-model-type-year), -1 (-year-make-mode-type)), 0 (type+year- makmodel),1(+年份+品牌+型号+类型)和2(+品牌+型号+类型+年份)

+号表示升序,-号表示降序秩序。

正如Gene评论的那样,你似乎混淆了ComparableComparator。第一个注意到一个类携带一个compareTo方法,因此该类的对象可以对自己进行排序。第二个表示一个类是一个单独的类,它知道如何对某个其他类的对象进行排序。

如果您希望在不同的情况下进行不同的排序,那么通常最好使用后者(Comparator)。当你只有一个特定的排序算法时,使用第一个(Comparable)。

当使用Comparator时,被排序的对象不必是Comparable

在现代Java中,Comparator增强了一些构建比较器的方便方法。

Comparator
.comparingInt( Car :: getYear )
.thenComparing( Car :: getMake )
.thenComparing( Car :: getModel() ) 

与其使用List,不如使用NavigableSet(如TreeSet)来保持对象的排序。

NavigableSet< Car > cars = new TreeSet<>( myComparator ) ;

我不明白你的问题最后一节所显示的逻辑,所以也许我误解了你的问题的真正本质。