有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何使自己的泛型结构具有动态比较器

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

我的结构树声明如下

public class Tree<T extends Comparable<T>> 

使用这种结构的类是这样的平面

public class Plane implements Comparable<Plane> 

使用override compareTo方法

问题是,如果我想用默认的比较器创建一个树,我可以很容易地使用它

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

但我想有另一个树结构,有平面和不同的compareTo方法,如何在平面中重写该方法

谢谢


共 (2) 个答案

  1. # 1 楼答案

    您可以将比较器作为平面的一个参数

        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方法时,只需将一个不同的Compariable实例或lambda表达式传递给构造函数

  2. # 2 楼答案

    定义重载构造函数:

    public Tree() {
      this(Comparator.naturalOrder());
    }
    
    public Tree(Comparator<? super T> comparator) {
      this.comparator = comparator; // store in a field
    }
    

    然后对树元素使用comparator而不是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();