Я хочу иметь DirectedWeightedMultigraph с «настроенными» вершинами и краями. С этим кодом я хотел бы иметь только три вершины, потому что у v1 и v4 один и тот же ключ, а у меня четыре.
DirectedWeightedMultigraph<Vertex, Edge> graph = new DirectedWeightedMultigraph<Vertex, Edge>(Edge.class);
Vertex v1 = new Vertex("a", "o1");
Vertex v2 = new Vertex("b", "o2");
Vertex v3 = new Vertex("c", "o1");
Vertex v4 = new Vertex("a", "o3");
graph.addVertex(v1);
graph.addVertex(v2);
graph.addVertex(v3);
graph.addVertex(v4);
System.out.println("#vertex: "+ graph.vertexSet().size());
Вот как выглядит моя вершина:
public class Vertex {
String key;
String other;
public Vertex(String id, String o){
key = id;
other = o;
}
public boolean equals(Object object) {
if (object == null || !(object instanceof Vertex)) {
return false;
}
return (this.key == ((Vertex) object).key);
}
public boolean isAVertex(Set<Vertex> set) {
boolean result = false;
for (Vertex v : set) {
if (this.equals(v)) {
result = true;
break;
}
}
return result;
}
}
Мои края выглядят так
public class Edge {
int cost;
}
Перед использованием ребер я прочитал это и это о равенстве и хэш-коде для вершины и ребра. Я также пытаюсь использовать ParanoidGraph, но это не работает. Чтобы решить эту проблему, я решил «вручную» проверить, находится ли вершина с определенным ключом в наборе вершин, прежде чем добавлять вершину. Но я скучаю по тому, что не так в моем коде. У меня все еще есть четыре вершины:
List<Vertex> rowVertices = new ArrayList<Vertex>();
rowVertices.add(v1);
rowVertices.add(v2);
rowVertices.add(v3);
rowVertices.add(v4);
Iterator it = rowVertices.iterator();
while (it.hasNext()) {
Vertex currentVertex = (Vertex) it.next();
if (!currentVertex.isAVertex(graph.vertexSet())) {
graph.addVertex(currentVertex);
}
}
System.out.println("#vertex: "+ graph.vertexSet().size());
if (this.equals(v))
в методеisAVertex()
. На самом деле у меня есть этот условный оператор в двух классах (реализованных точно так же), но он работает в одном классе, а в другом мне нужно использоватьif (this.key.equals(v.key))
. Что не так ??? - person bkm   schedule 17.05.2014