В настоящее время я сталкиваюсь с сценарием, где у меня есть строковые кортежи (размером 2), а два кортежа должны считаться равными, если они имеют хотя бы один общий элемент. У меня есть следующий класс, реализующий эту идею:Метод hashCode() для следующего случая: два набора равны, если они имеют хотя бы один общий элемент?
public class MyTuple
{
private List<String> list = Arrays.asList(new String[2]);
public List<String> getList()
{
return list;
}
public void set(String firstElement, String secondElement)
{
list.set(0, firstElement);
list.set(1, secondElement);
}
@Override
public boolean equals(Object other)
{
if (other instanceof MyTuple) {
return !Collections.disjoint(this.list, ((MyTuple) other).getList());
}
return false;
}
}
Однако, согласно hashCode()
контракта:
Если два объекта равны по равных метод (Object), то вызов хэш-код() метод на каждом из двух объектов должен давать одинаковый целочисленный результат.
Как я могу переопределить мой метод hashCode()
, чтобы не нарушать договор?
Нет необходимости, потому что 'MyTuple' никогда не может быть ключевым в коллекции. –
Почему бы и нет? Я использую Spark, и MyTuple будет ключом в парных RDD. –
TrnKh
Возвращает константу для hashCode(). Это, безусловно, приведет к повышению производительности при использовании MyTuple в любой коллекции, которая использует хэш-код, но с вашим «динамическим» правилом равенства это единственный способ удовлетворить контракт. – Durandal