Что можно закастить в SortedSet?

68
06 марта 2022, 06:30

Никак не могу понять, что еще можно отлить в SortedSet. Перепробовал несколько типов коллекций. Выдает ошибку: java.lang.ClassCastException: java.util.stream.SortedOps$OfRef cannot be cast to java.util.SortedSet.

Само задание: На вход получаю коллекцию пользователей, удаляю все дубли(имя и возраст), сортируем по имени и возрасту, возвращаем последнего пользователя.

Мое решение:

 public static User task1(Collection<User> source) {
        Collection<User> users = new ArrayList<>(source);
        Collection<User> filter = users.stream().collect(Collectors.toSet());
        SortedSet<User> sortedUser = (SortedSet<User>) filter.stream().sorted();
        return sortedUser.last();
    }

TEST:

@Test
    public void task1() {
        List<User> users = Arrays.asList(new User("Ivan", 15), new User("Masha", 17), new User("Kolya", 23), new User("Denis", 7), new User("Vova", 45), new User("Marina", 15), new User("Kolya", 15), new User("Vova", 25), new User("Vlad", 26), new User("Ivan", 17));
        User result = Lesson11to12_SetMap.task1(users);
        Assertions.assertEquals("Vova", result.getName(), "В конце должен быть Vova, 45 лет");
        Assertions.assertEquals(45, result.getAge(), "В конце должен быть Vova, 25 лет");
    }
Answer 1

Это

System.out.println(users.stream().collect(Collectors.toSet()) instanceof HashSet);

Выводит true.
P.S.: В исходниках toSet() нет имплементации интерфейса SortedSet

Важные интерфейсы, которые реализует HashSet:

Set, Collection

SortedSet же интерфейс. А так как его нет в списке интерфейсов, которые реализует HashSet(учитывать P.S.) - значит и привести к нему вы не можете.

Я бы переписал вашу функцию так:

public static User task1(Collection<User> source) {
    Object[] users = source.stream().distinct().sorted(Comparator.comparing(User::getName).thenComparingInt(User::getAge)).toArray();
    return (User) users[users.length - 1];
}

Правда, distinct(удаление дубликатов) не нужен, так как нам все равно, сколько дубликатов будет на конце - нам же последний User нужен.

Answer 2

Само задание: На вход получаю коллекцию пользователей, удаляю все дубли(имя и возраст), сортируем по имени и возрасту, возвращаем последнего пользователя.

Проще говоря, нужно получить максимальный элемент коллекции

public static User task1(Collection<User> users) {
    return Collections.max(users, Comparator.comparing(User::getName).thenComparingInt(User::getAge));
}
READ ALSO
После сортировки выводит не тот элемент, который нужен

После сортировки выводит не тот элемент, который нужен

В дополнении к вопросу Что можно закастить в SortedSet?, нашел решение, но выдает другую ошибку! Почему, не могу понять

146
replaceAll и обратные слэши

replaceAll и обратные слэши

Сегодня занимался в Java проблемой кавычек в SQL запросах (инъекция) и обнаружил, что чтобы после результата функции получить \', я должен написать...

87
как переназначить ссылку this

как переназначить ссылку this

Как сделать чтобы методе класса можно было перекинуть ссылку объекта на созданный новый объект

93
Как добавить несколько фрагментов в один контейнер?

Как добавить несколько фрагментов в один контейнер?

Пытаюсь добавить несколько фрагментов в один контейнер, но в результате получается так, как если бы добавлял без цикла первый фрагментГде...

80