У меня есть HashSet, который хранит некоторые грани в графе. Каждый край имеет два узла.HashSet добавляет повторяющиеся объекты
В случае граф неориентированный, добавив, дубликат должен терпеть неудачу:
Edge a = new Edge(new Node("aa"), new Node("bb"));
Edge duplicate = new Edge(new Node("aa"), new Node("bb"));
Но в следующем примере это работает:
System.out.println(a.equals(duplicate));
Set<Edge> sete = new HashSet<Edge>();
System.out.println(sete.contains(a));
System.out.println(sete.add(a));
System.out.println(sete.contains(duplicate));
System.out.println(sete.add(duplicate));
Output:
true
false
true
false
true
EDIT: Хорошо, теперь я добавил hashCode метод, который работает для направленных Edges. Помогает ли кто-нибудь мне вычислить хэш для неориентированных границ?
public class Edge {
private Node first, second;
@Override
public /boolean equals(Object ob) {
if (ob instanceof Edge) {
Edge edge = (Edge) ob;
if (first.equals(edge.first)
&& second.equals(edge.second)
|| first.equals(edge.second)
&& second.equals(edge.first))
return true;
}
return false;
}
@Override
public int hashCode() {
int hash = 17;
int hashMultiplikator = 79;
hash = hashMultiplikator * hash
+ first.hashCode();
hash = hashMultiplikator * hash
+ second.hashCode();
return hash;
}
как же вы реализуете равных() и хэш-код()? – Synox
Вы переопределили метод 'equals' для' Node'? – Sam
@Sam '.equals()' недостаточно, вы также должны реализовать '.hashCode()'; иначе вы нарушите контракт «Объект». – fge