我必须编写一个通用堆优先级队列,以及三个独立的比较器类来比较不同的东西。如何将不同的比较器分配给堆的每个实例。所以在我的主要内容中,我会有类似
的内容GenericHeap D= new GenericHeap <String> ();
GenericHeap S= new GenericHeap <Integer> ();
然后D的方法,比如add和remove,必须使用我所做的比较器,S必须使用不同的方法。如何为堆类的每个实例分配比较器。所有的堆都必须用相同的代码编写,所以我不明白它是如何工作的?
答案 0 :(得分:0)
您可以将其作为构造函数参数
GenericHeap D = new GenericHeap<String>(new MyStringComparator());
或通过mutator函数
D.setComparator(new MyStringComparator());
无论哪种方式,您都应该使这些函数采用像IMyComparatorInterface这样的方法,它具有比较方法(T item1,T item2)
public class MyStringComparator implements IMyComparatorInterface
答案 1 :(得分:0)
不是实现Comparator,而是可以为每种类型创建不同的类型,并在那些上调用.compare。用GenericHeap替换List:
Comparator<List<String>> stringListComparator = new Comparator<List<String>>() {
@Override
public int compare(List<String> arg0, List<String> arg1) {
// TODO Add comparison code
return 0;
}
};
Comparator<List<Integer>> integerListComparator = new Comparator<List<Integer>>() {
@Override
public int compare(List<Integer> arg0, List<Integer> arg1) {
// TODO Add comparison code
return 0;
}
};
stringListComparator.compare(Collections.emptyList(), Collections.emptyList());
integerListComparator.compare(Collections.emptyList(), Collections.emptyList());
或者使用Java 8 lamdas:
Comparator<List<String>> stringListComparator = (p1, p2) -> {
// TODO Add comparison code
return 0;
};
Comparator<List<Integer>> integerListComparator = (p1, p2) -> {
// TODO Add comparison code
return 0;
};
stringListComparator.compare(Collections.emptyList(), Collections.emptyList());
integerListComparator.compare(Collections.emptyList(), Collections.emptyList());
或者,实现Comparable,在构造函数中传入Comparator并从.compare调用它,如下所示:
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
public class StackOverflowExample implements Comparable<StackOverflowExample> {
private final Comparator<StackOverflowExample> comparator;
public StackOverflowExample(Comparator<StackOverflowExample> comparator) {
this.comparator = comparator;
}
@Override
public int compareTo(StackOverflowExample arg0) {
return comparator.compare(this, arg0);
}
public static void main(String[] args) {
Comparator<StackOverflowExample> comparator = (p1, p2) -> {
// TODO Add comparison code
};
StackOverflowExample stackOverflowExample = new StackOverflowExample(comparator);
}
}