Никак не могу понять, что еще можно отлить в 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 лет");
}
Это
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 нужен.
Само задание: На вход получаю коллекцию пользователей, удаляю все дубли(имя и возраст), сортируем по имени и возрасту, возвращаем последнего пользователя.
Проще говоря, нужно получить максимальный элемент коллекции
public static User task1(Collection<User> users) {
return Collections.max(users, Comparator.comparing(User::getName).thenComparingInt(User::getAge));
}
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
В дополнении к вопросу Что можно закастить в SortedSet?, нашел решение, но выдает другую ошибку! Почему, не могу понять
Сегодня занимался в Java проблемой кавычек в SQL запросах (инъекция) и обнаружил, что чтобы после результата функции получить \', я должен написать...
Как сделать чтобы методе класса можно было перекинуть ссылку объекта на созданный новый объект
Пытаюсь добавить несколько фрагментов в один контейнер, но в результате получается так, как если бы добавлял без цикла первый фрагментГде...