java Как использовать свой Comprator в TreeMap

208
26 июля 2017, 20:53

Допустим у меня есть класс User с полями int id, String name. Я добавляю эти объекты в TreeMap. По условию я считаю что ключ уникальности для user это id. Т.е. если в TreeMap есть юзер с id = 1 и name = Alex, то при добавлении юзера с таким же id и новым именем, должна произойти замена. Для этого в классе User я сделал implements Comparable и переписал методы hashCode() и equals(). Все работает. Далее мне надо сделать сортировку по name, но при этом сохранить уникальность по id. Если я делаю свой Comprator в котором делаю сортировку по name и задаю его в конструкторе TreeMap, то уникальность слетает. В коллекции появляются два юзера с одинаковыми id.

Как сделать сортировку по имени, сохранив уникальность по id?

public class UserNameComparator implements Comparator<User> {
    @Override
    public int compare(User o1, User o2) {
        String name1 = o1.getName();
        String name2 = o2.getName();
        return name1.compareTo(name2);
    }
}
Answer 1

Вроде разобрался. Добавил в compare сравнение по id.

  @Override
public int compare(User o1, User o2) {
    if ((o1.getId() - o2.getId()) == 0) {
        return 0;
    }
    String name1 = o1.getName();
    String name2 = o2.getName();
    return name1.compareTo(name2);
}
Answer 2

Вы пытаетесь усидеть на двух стульях - в качестве ключа вы используете и id, и name одновременно. Одна коллекция так делать не умеет, поэтому вам надо использовать две разные коллекции:

Map<Integer, User> usersById = new HashMap<Integer, User>();
Map<String, List<User>> usersByName = new TreeMap<String, List<User>>();
void putUser(User newUser) {
    User oldUser = usersById.put(newUser.getId());
    if (oldUser == newUser) return;
    if (oldUser != null) usersByName.get(oldUser.getName()).remove(oldUser);
    List<User> list = usersByName.get(newUser.getName());
    if (list == null) usersByName.put(newUser.getName(), list = new ArrayList<User>());
    list.add(newUser);
}
READ ALSO
Парсинг xml и теги

Парсинг xml и теги

При парсинге локального xml документа с тегом DOCTYPE mvideo_xml SYSTEM "http://apimvideo

194
Кнопка перевода сайта с русского на английский

Кнопка перевода сайта с русского на английский

Каким образом можно реализовать кнопку переключения языка сайта в виде иконки с буквами «EN», при клике на которую весь сайт «превращался»...

505
Вертикальное выравнивание в Bootstrap CSS

Вертикальное выравнивание в Bootstrap CSS

Делаю через Bootstrap 3, нужно выравнивание нескольких (любых объектов) с чётным-нечётным количеством (не строчные!)Примеры с прописыванием точных...

658
Нарисовать разные слои так, чтобы не сбился весь дизайн

Нарисовать разные слои так, чтобы не сбился весь дизайн

Есть страница, составленная из квадратиков как на фотографии ниже(1)И все они расположены плотно друг к другу

229