簡體   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