Какие есть альтернативы TreeSet

163
27 февраля 2022, 08:50

Решил задачу, но как я понял просто TreeSet без лишних методов для сортировки классов не годится. Выдает ошибку: cannot be cast to class java.lang.Comparable. Что можно использовать взамен TreeSet.

/**
 * В этом методе необходимо реализовать:
 * 1. На вход получаем коллекцию пользователей
 * 2. Удаляем все дубли (одинаковое имя и возраст)
 * 3. Сортируем по имени и возрасту
 * 4. Возвращаем последнего пользователя
 */
public static <T> User task1(Collection<User> source) {
    Collection<User> users = new TreeSet<>(source);
    Iterator<T> iterator = (Iterator<T>) users.iterator();
    T lastElement = iterator.next();
    while(iterator.hasNext()){
        lastElement = iterator.next();
    }
    return (User) lastElement;
}

Изменения в класс вносить нельзя!

@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

Сортировка по возрасту, аналогично делается и по имени

List<User> ulist = users.stream().sorted(Comparator.comparing(User::getAge)).collect(Collectors.toList());
Answer 2

У указанного класса есть конструктор TreeSet(java.util.Comparator), в который можно явным образом передать компаратор. Следовательно указанный код преобразится примерно в следующее:

Set<User> users = new TreeSet<>(new Comparator<String>() {
        @Override
        public int compare(User s1, User s2) {
            //тут надо реализовать сравнение
        }
    });
users.addAll(source);

После чего указанная ошибка должна перестать падать.

Answer 3
public static <T> User task1(Collection<User> source) {
    return source.stream()
            //Удаляем все дубли (одинаковое имя и возраст) - это отработает, только если у User переопределен метод equals корректно
            .distinct()
            //Сортируем по имени и возрасту
            .sorted(Comparator.comparing(User::getName).thenComparing(User::getAge))
            // Возвращаем последнего пользователя
            .reduce((u1, u2) -> u2) 
            .orElseThrow(() -> new IllegalArgumentException("Source is empty"));
}
READ ALSO
Factory method - Фабричный метод

Factory method - Фабричный метод

Зачем нужен фабричный метод?

109
добавлять значения в firebase database сверху

добавлять значения в firebase database сверху

Весь цикл записи и чтения работает на ура, но новые значения появляются снизу БД:

204
Вращение фигуры во круг точки

Вращение фигуры во круг точки

Такая проблема: в поставленной задаче требуется сделать вращение фигуры вокруг своего центра

93
Как в Spring WebFlux использовать Gson вместо Jackson?

Как в Spring WebFlux использовать Gson вместо Jackson?

Не думал что придется тратить на это время,но уже изрядно потрепался в поисках ответаИспользование spring

93