如何使自己的通用结构具有动态比较器

时间:2019-10-27 09:04:17

标签: java comparator comparable

我想知道如何在实现Comparable的类中重写compareTo方法

我的结构树这样声明

public class Tree<T extends Comparable<T>> 

使用该结构的类是看起来像这样的飞机

public class Plane implements Comparable<Plane> 

带有覆盖compareTo方法,

问题是,如果我想使用默认的比较器创建树,则可以使用

轻松地做到这一点。
Tree<Plane> planes = new Tree<Plane>();

但是我想使用平面和具有不同的compareTo方法的另一个树结构,如何在平面中覆盖该方法?

谢谢

2 个答案:

答案 0 :(得分:3)

定义一个重载的构造函数:

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();

答案 1 :(得分:0)

您可以将比较器作为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);
        }
    }

无论何时要更改compare方法,只需将不同的Comparable实例或lambda表达式传递给构造函数