【发布时间】:2018-01-19 08:40:20
【问题描述】:
我是 Java 新手,我正在尝试实现一种可能使用自然顺序或给定比较器参数的排序算法。
假设我有一个可比较的类C,具有一些自然顺序compareTo,一个比较器子类ByAltOrder,我有一个Comparator<C> 方法,它返回一个新的ByAltOrder。
public class C implements Comparable<C> {
... //fields and constructor
public int compareTo(C that) { ... } //natural order
public Comparator<C> altOrder() { //some alternative order
return new ByAltOrder();
}
public class ByAltOrder implements Comparator<C>{
public int compare(C x, C y) { ... }
}
}
我想编写一个可以使用自然顺序或替代顺序的函数。我知道如何编写一个使用 either 自然顺序或替代顺序的函数,但我不想两次编写相同的代码,但差异很小。这可能吗?
假设我想编写一个返回非空数组最大值的函数。按照自然顺序,它看起来像这样:
public C max(C[] xs){
res = xs[0];
for (i = 1; i < xs.length; i++) {
if (xs[i].compareTo(res) > 0) {
res = points[i];
}
}
return res;
}
使用 Comparator 看起来像这样,我可以将 x.altOrder() 作为第二个参数传递:
public C max(C[] xs, Comparator c){
res = xs[0];
for (i = 1; i < xs.length; i++) {
if (c.compare(xs[i], res) > 0) {
res = points[i];
}
}
return res;
}
但是我如何编写一个包含两者的函数呢?
编辑:我知道在 Java 中有一个 Arrays.sort,但实现 sort 或 max 只是我关于传递比较器/代码重用/Java 实践的问题的一个玩具示例。也许我没有说清楚。
【问题讨论】:
-
您的第一个方法应该简单地委托给第二个方法并将 Comparator.naturalOrder() 作为第二个参数传递。请不要使用原始类型。
标签: java code-reuse