Я попытался просто приравнять два экземпляра jgraphT, и он возвращает false, хотя они идентичны. Затем я попытался переопределить equals с моей реализацией:
public boolean equals(MyGraph<CustomV, CustomE> otherGraph){
boolean result = true;
Iterator<CustomV> vertexes = otherGraph.vertexSet().iterator();
while(result && vertexes.hasNext()){
result = this.containsVertex((V) vertexes.next());
}
Iterator<CustomE> edges = otherGraph.edgeSet().iterator();
while(result && edges.hasNext())
result = this.containsEdge((E) edges.next());
return result;
}
и увидел, что метод containsEdge() дает сбой, если это ребро не является ТОЧНЫМ объектом. Это странно, так как я позаботился о том, чтобы переопределить методы equals как для ребер, так и для переключателей...
редактировать: сделал этот эксперимент:
CustomV aNode = new CustomV(1,2);
myGraph.addVertex(aNode);
System.out.println(myGraph.containsVertex(aNode)); //true
System.out.println(myGraph.containsVertex(new CustomV(1,2))); //false..but should be true
и, как вы можете видеть, метод containsVertex() не работает.
edit2: благодаря глупому уроду я почти решил: мне тоже пришлось переопределить метод hashcode(). Теперь это работает для вершин, но для ребер я получаю исключение нулевого указателя в хэш-коде, это мой переопределенный метод:
@Override
public int hashCode() {
return (getSource().hashCode()+getTarget().hashcode());
}
Я получаю нулевой указатель, когда пытаюсь создать ребро на графике (я полагаю, здесь вызывается hashcode()):
myGraph.addEdge(a,b);
Проблема в том, что getSource() и getTarget() возвращают null при вызове в этот момент... как решить? Это стек исключений:
Исключение в потоке «основной» java.lang.NullPointerException в org.at.network.types.CustomE.hashCode(CustomE.java:71) в java.util.HashMap.hash(HashMap.java:366) в java.util. HashMap.getEntry(HashMap.java:466) в java.util.HashMap.containsKey(HashMap.java:453) в org.jgrapht.graph.AbstractBaseGraph.containsEdge(AbstractBaseGraph.java:359) в org.jgrapht.graph.AbstractBaseGraph .addEdge(AbstractBaseGraph.java:208) в org.jgrapht.graph.GraphDelegator.addEdge(GraphDelegator.java:131) в org.jgrapht.graph.DefaultListenableGraph.addEdge(DefaultListenableGraph.java:162) в org.at.network. types.MyGraph.addCustomEdge(MyGraph.java:27) в org.at.network.Test.main(Test.java:220)
Метод addcustomedge следующий:
public CustomE addCustomEdge(V sourceVertex, Port sourcePort,
V targetVertex, Port targetPort){
CustomE l = (CustomE)super.addEdge(sourceVertex, targetVertex);
l.setSourceP(sourcePort);
l.setTargetP(targetPort);
return l;
}
Порт — это просто простая структура данных для пары строк.
this
имеет ребра{e1, e2}
, аother
имеет{e2}
. ваш цикл не поймет, чтоe1
отсутствует вthis
. проще всего также проверить количество ребер (и вершин). - person Silly Freak   schedule 27.05.2014Object.equals
иhashCode
? убедитесь, что вы понимаете это, и вы получите свой ответ. - person Silly Freak   schedule 27.05.2014a.equals(b)
, тогдаa.hashCode()
должно быть таким же, какb.hashCode()
, что особенно актуально при использовании HashSet, как вы, вероятно, делаете вedgeSet()
. Я тоже знаю, о чем говорю. - person Silly Freak   schedule 27.05.2014CustomE
тоже важен. - person Silly Freak   schedule 28.05.2014