Как создать собственную родовую структуру для динамического компаратора - PullRequest
1 голос
/ 27 октября 2019

Я хочу знать, как я могу переопределить метод compareTo в классе, который реализует Comparable

Моя структура Tree объявлена ​​следующим образом

public class Tree<T extends Comparable<T>> 

, и класс, который использовал эту структуру, является Plane, который выглядитвот так

public class Plane implements Comparable<Plane> 

с переопределением метода CompareTo,

Дело в том, что если я хочу создать дерево с компаратором по умолчанию, я могу легко это сделать с помощью этого

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

но я хочу иметь другую древовидную структуру с плоскостями и с другим методом сравнения, как я могу переопределить этот метод на плоскости?

Спасибо

Ответы [ 2 ]

3 голосов
/ 27 октября 2019

Определите перегруженный конструктор:

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();
0 голосов
/ 27 октября 2019

вы можете сделать компаратор как параметр 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 или лямбда-выражение в конструктор

...