Допустим у меня есть класс 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);
}
}
Вроде разобрался. Добавил в 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);
}
Вы пытаетесь усидеть на двух стульях - в качестве ключа вы используете и 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);
}
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
При парсинге локального xml документа с тегом DOCTYPE mvideo_xml SYSTEM "http://apimvideo
Каким образом можно реализовать кнопку переключения языка сайта в виде иконки с буквами «EN», при клике на которую весь сайт «превращался»...
Делаю через Bootstrap 3, нужно выравнивание нескольких (любых объектов) с чётным-нечётным количеством (не строчные!)Примеры с прописыванием точных...
Есть страница, составленная из квадратиков как на фотографии ниже(1)И все они расположены плотно друг к другу