В моей программе java у меня есть карта с корреляцией между someID и объектом данных типа MyClass.Как я могу реализовать асимметричный эквивалент funciton?
ConcurrentMap<Integer, MyClass> a;
Реже, но регулярно, я должен проверить, содержит ли один из объектов «значение» определенный длинный переменный b. Поскольку я не знаю корреляции someId с моим другим, я не могу получить к нему доступ через карту. Для этого я хотел бы использовать containsValue:
a.containsValue(otherId)
Для достижения этой цели я переписал в хэш-код и функция равна.
@Override
public boolean equals(Object o) {
if ((o instanceof MyClass) && (((MyClass) o).someId().equals(this.someId()))) {
return true;
} else
if ((o instanceof Long) && ((Long) o) == this.otherId) {
return true;
} else {
return false;
}
}
ПРИМЕЧАНИЕ: Иначе в коде необязательно должен быть некоторый идентификатор карты.
Первый оператор if симметричен, второй, очевидно, нет. Я понимаю, что это нехорошо, но писать петлю каждый раз тоже не приятно. В this post говорят, что асимметричные равенства будут игнорироваться. Как я могу заставить java игнорировать проблему асимметрии?
равно должен быть симметричным по определению, и в этом случае вы не можете сделать это «игнорировать» проблема потому что вы не можете изменить класс 'Long'. если ваш ключ может быть «Длинным», просто сделайте его длинным. –
Вызов 'containsValue' на карте следует избегать, где это возможно, так как это операция' O (n) '. –