Допустим у меня есть класс 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);
}
Продвижение своими сайтами как стратегия роста и независимости