如何使我自己的通用结构具有动态比较器
How to make my own generic structure to have dynamic comparator
我想知道如何覆盖 class 中实现 Comparable
的 compareTo 方法
我的结构树是这样声明的
public class Tree<T extends Comparable<T>>
和class使用那个结构的Plane就是那个样子
public class Plane implements Comparable<Plane>
使用覆盖 compareTo 方法,
问题是,如果我想用默认比较器创建一棵树,我可以用这个轻松地做到这一点
Tree<Plane> planes = new Tree<Plane>();
但我想要另一个带有平面和不同 compareTo 方法的树结构,我如何才能在平面中覆盖该方法?
谢谢
你可以将比较器作为Plane的参数
public class Plane implements Comparable<Plane> {
private Comparable<Plane> c;
public Plane(Comparable<Plane> c) {
this.c = c;
}
@Override
public int compareTo(Plane another) {
return c.compareTo(another);
}
}
每当你想改变比较方法时,只需将不同的 Comparable 实例或 lambda 表达式传递给构造函数
定义重载构造函数:
public Tree() {
this(Comparator.naturalOrder());
}
public Tree(Comparator<? super T> comparator) {
this.comparator = comparator; // store in a field
}
然后在树元素上使用比较器而不是 compareTo
方法。
但请注意,提供比较器的能力消除了 T extends Comparable<T>
的限制(无论如何 T extends Comparable<? super T>
更好)。
但在这种情况下,您不能类型安全地拥有默认构造函数。您要么需要始终通过比较器;要么或者提供一个静态工厂方法来创建一个自然排序的树:
static <T extends Comparable<? super T>> Tree<T> withNaturalOrder() {
return new Tree<>(Comparator.naturalOrder());
}
并像这样调用
Tree<String> tree = Tree.withNaturalOrder();
我想知道如何覆盖 class 中实现 Comparable
的 compareTo 方法我的结构树是这样声明的
public class Tree<T extends Comparable<T>>
和class使用那个结构的Plane就是那个样子
public class Plane implements Comparable<Plane>
使用覆盖 compareTo 方法,
问题是,如果我想用默认比较器创建一棵树,我可以用这个轻松地做到这一点
Tree<Plane> planes = new Tree<Plane>();
但我想要另一个带有平面和不同 compareTo 方法的树结构,我如何才能在平面中覆盖该方法?
谢谢
你可以将比较器作为Plane的参数
public class Plane implements Comparable<Plane> {
private Comparable<Plane> c;
public Plane(Comparable<Plane> c) {
this.c = c;
}
@Override
public int compareTo(Plane another) {
return c.compareTo(another);
}
}
每当你想改变比较方法时,只需将不同的 Comparable 实例或 lambda 表达式传递给构造函数
定义重载构造函数:
public Tree() {
this(Comparator.naturalOrder());
}
public Tree(Comparator<? super T> comparator) {
this.comparator = comparator; // store in a field
}
然后在树元素上使用比较器而不是 compareTo
方法。
但请注意,提供比较器的能力消除了 T extends Comparable<T>
的限制(无论如何 T extends Comparable<? super T>
更好)。
但在这种情况下,您不能类型安全地拥有默认构造函数。您要么需要始终通过比较器;要么或者提供一个静态工厂方法来创建一个自然排序的树:
static <T extends Comparable<? super T>> Tree<T> withNaturalOrder() {
return new Tree<>(Comparator.naturalOrder());
}
并像这样调用
Tree<String> tree = Tree.withNaturalOrder();