Создание нового компаратора для TreeSet в Java

У меня есть пользовательский класс с именем User. Этот класс реализует сопоставимые и имеет поля данных с идентификатором, подписчиками и подписчиками.

Я хочу отсортировать элементы в TreeSet так, чтобы пользователь с наибольшим количеством подписчиков был первым, а пользователь с наименьшим количеством подписчиков - последним. Если у обоих Пользователей одинаковое количество фолловеров, сортируйте по тому, сколько людей фолловит Пользователь. Если они подписаны на одно и то же количество людей, сортируйте их по идентификационному номеру.

class User implements Comparable<User>
{
    private int userId;
    private ArrayList<User> following;
    private ArrayList<User> followers;
    Set<User> sortingSet = new TreeSet<User>();
}

Я также реализовал метод compareTo

public int compareTo(User other)
{
    if(this.followers.size() > other.followers.size())
        return -1;

    if(this.followers.size() < other.followers.size())
        return 1;

    if(this.following.size() > other.following.size())
        return -1;

    if(this.following.size() < other.following.size())
        return 1;

    if(this.userId < other.userId)
        return -1;

    if(this.userId > other.userId)
        return 1;

    return 0;
}

Когда я добавляю в TreeSet, он просто сортируется на основе идентификатора пользователя.

РЕДАКТИРОВАТЬ: Спасибо за помощь, я внес некоторые изменения в код. Я удалил некоторые лишние операторы if. Я также реализовал метод compareTo, но проблема осталась прежней. Я также уже написал методы equals() и hashcode().

EDIT2: Еще раз всем спасибо за помощь. Я понял проблему, и она связана с тем, как я инициализировал последователей и следил за ArrayLists. Я виню в этой ошибке недостаток сна.


person ToopDoop    schedule 03.05.2019    source источник
comment
Каждый третий if лишний.   -  person steffen    schedule 03.05.2019
comment
Я думаю, вам не нужен этот Comp или любой другой Comparator, потому что вы можете реализовать логику сравнения в методе compareTo метода User, который должен реализовать его, потому что он implements Comparable<User>. Добавьте правильные equals и hashCode к User, и TreeSet отсортирует их соответствующим образом.   -  person deHaar    schedule 03.05.2019
comment
Удалите больше операторов if: int cmpFollowers = Integer.compare(other.followers.size(), this.followers.size()); if (cmpFollowers != 0) return cmpFollowers;   -  person Andy Turner    schedule 03.05.2019
comment
Можете ли вы опубликовать свой основной метод, в котором вы добавляете данные в Set ?   -  person Nitika    schedule 03.05.2019
comment
Выглядит очень странно, что у каждого User есть такой TreeSet. Кроме того, вы должны понимать, что свойства не должны изменяться после добавления объекта в TreeSet.   -  person Holger    schedule 06.05.2019


Ответы (1)


Вы не создали компаратор. Вы создали вещь под названием Comp, которую можно сравнить с пользователями.

Компаратораппарат — это вещь, которая сравнивает две вещи. Comparable — это то, что может сравнивать себя с чем-то.

Comparable.compareTo принимает один аргумент. Comparator.compare принимает два аргумента.

person Community    schedule 03.05.2019