Поскольку сортировка TreeMap основана только на ключах, я использую пользовательский объект в качестве ключа в treemap. Я уважал на мой взгляд, контракт между равными и CompareTo в этом случае, если два объекта равны, т.е CompareTo возвращает 0.Использование моего собственного объекта как ключа в TreeMap
Ниже код объекта:
public final class UserHighScore implements Comparable<UserHighScore>{
private final int userId;
private final int value;
public UserHighScore(int userId, int value) {
this.userId = userId;
this.value = value;
}
public int getUserId() {
return userId;
}
public int getValue() {
return value;
}
@Override
public boolean equals(Object obj) {
if (obj == this) return true;
if (!(obj instanceof UserHighScore)) {
return false;
}
UserHighScore userHighScore = (UserHighScore) obj;
return userHighScore.userId==userId;
}
@Override
public int compareTo(UserHighScore uh) {
if(uh.getUserId()==this.getUserId()) return 0;
if(uh.getValue()>this.getValue()) return 1;
return -1;
}
}
И ниже метода, вызывающего проблему:
Если идентификаторы пользователя одинаковы, я хочу вернуть 0, чтобы избежать дублирования, поэтому, если я делаю map.put (userHighscore), он должен автоматически заменить, есть ли другой объект на карте с тем же Идентификатор пользователя. Однако, если пользователи отличаются друг от друга, я хочу, чтобы они отсортировались по их значениям. Этот подход работает отлично для одного потока, однако мое приложение является параллельным, и когда есть больше, чем триады, он добавляет дубликаты к карте. Моя проблема связана с картой рекордов, которая является одновременным Хасмапом и внутри нее содержит treemap.
Вы видите что-то не так с моим подходом?
Если вы используете несколько потоков, какова ваша стратегия синхронизации? – vanje
Возможно, вы захотите использовать карту из параллельного пакета https://docs.oracle.com/javase/tutorial/essential/concurrency/collections.html –
Уже это делает. Я отредактировал вопрос, чтобы показать код, я использую concurrentHashmap – fgonzalez