Почему TreeSet имеет отдельный конструктор для SortedSet, когда он уже существует для любой коллекции? - PullRequest
0 голосов
/ 07 декабря 2018

Конструктор для любой Коллекции: public TreeSet(Collection<? extends E> c)

Отдельный конструктор для SortedSet: public TreeSet(SortedSet<E> s)

Почему существует необходимость в отдельном конструкторе для SortedSet?

Ответы [ 3 ]

0 голосов
/ 07 декабря 2018

Документ TreeSet

public TreeSet(Collection<? extends E> c)

Создает новый набор деревьев, содержащий элементы в указанной коллекции, отсортированные пок естественному упорядочению его элементов.Все элементы, вставленные в набор, должны реализовывать интерфейс Comparable.Кроме того, все такие элементы должны быть взаимно сопоставимыми: e1.compareTo (e2) не должно создавать исключение ClassCastException для любых элементов e1 и e2 в наборе.

Обратите больше внимания на ", отсортированный согласнок естественному упорядочению его элементов"

public TreeSet(SortedSet<E> s)

Создает новый набор деревьев, содержащий те же элементы и используя тот же порядок, что иуказанный отсортированный набор.

0 голосов
/ 07 декабря 2018

Давайте запустим эту программу с двумя разными вариантами:

public static void main(String[] args) {
    List<User> ul = new ArrayList<>();
    ul.add(new User());
    ul.add(new User());

    Set<User> users = new TreeSet<>(ul);
}

сначала с нижним (здесь мы реализуем Comparator)

private static class User implements Comparator<User> {
    @Override
    public int compare(User o1, User o2) {
        return 0;
    }
}

С этой программой она выдает Exceptionв потоке "main" java.lang.ClassCastException: test.WTest $ Пользователь не может быть приведен к java.lang.Comparable

, поскольку этот конструктор ожидает, что пользователь реализует java.util.Сопоставимый интерфейс.

Второй запуск, если вы измените реализацию класса User ниже

private static class User implements Comparable<User> {

    @Override
    public int compareTo(User o) {
        return 0;
    }
}

Код работает просто отлично!Обратите внимание на разницу в реализациях, теперь мы реализуем интерфейс java.lang.Comparable.

Но класс TreeSet работает с обоими типами, либо с Comparator, либо с Comparable.Таким образом, выбор конструктора зависит только от типа реализации вашего объекта.

0 голосов
/ 07 декабря 2018

Из документации конструктора, который принимает SortedSet:

Создает новый набор деревьев, содержащий те же элементы и используя тот же порядок, что и указанный отсортированный набор.

При инициализации TreeSet из Collection используется естественное упорядочение элементов, как видно из документации другого конструктора, который принимает Collection:

Создает новый набор деревьев, содержащий элементы в указанной коллекции, отсортированные в соответствии с естественным порядком его элементов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...