繁体   English   中英

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

[英]How to make my own generic structure to have dynamic comparator

我想知道如何覆盖实现 Comparable 的 class 中的 compareTo 方法

我的结构树是这样声明的

public class Tree<T extends Comparable<T>> 

和使用该结构的 class 是看起来像那样的平面

public class Plane implements Comparable<Plane> 

使用覆盖 compareTo 方法,

问题是如果我想创建一个带有默认比较器的树,我可以很容易地做到这一点

Tree<Plane> planes = new Tree<Plane>();

但我想要另一个带有平面和不同 compareTo 方法的树结构,我如何在平面上覆盖该方法?

谢谢

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

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 工厂方法来创建一个自然排序的树:

static <T extends Comparable<? super T>> Tree<T> withNaturalOrder() {
  return new Tree<>(Comparator.naturalOrder());
}

并像调用

Tree<String> tree = Tree.withNaturalOrder();

您可以将比较器作为 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 表达式传递给构造函数

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM