Java で、等しい頂点/エッジを含む単純なグラフ (グラフ ループまたは複数のエッジを含まない重み付けされていない無向グラフ) を作成したい。
2 つの Java クラスがあり、1 つは頂点用です。
class Vertex {
private int field;
public Vertex(int field) {
this.field = field;
}
@Override
public boolean equals(Object obj) {
if (obj.getClass().getPackage()
.equals(this.getClass().getPackage())
&& obj.getClass().getName()
.equals(this.getClass().getName())) {
Vertex vertex = (Vertex) obj;
if (this.field == vertex.field)
return true;
}
// Else
return false;
}
@Override
public int hashCode() {
// No need for a perfect hash
return this.field;
}
}
エッジのクラス:
class Edge {
private int field;
public Edge(int field) {
this.field = field;
}
@Override
public boolean equals(Object obj) {
if (obj.getClass().getPackage()
.equals(this.getClass().getPackage())
&& obj.getClass().getName()
.equals(this.getClass().getName())) {
Edge edge = (Edge) obj;
if (this.field == edge.field)
return true;
}
// Else
return false;
}
@Override
public int hashCode() {
// No need for a perfect hash
return this.field;
}
}
現在、JGraphT ライブラリを使用しています。しかし、私はIllegalArgumentException: "loops not allowed"
このコードを開始した後に遭遇しました:
// Define a EdgeFactory
EdgeFactory<Vertex, Edge> BOND_FACTORY = new EdgeFactory<Vertex, Edge>() {
@Override
public Edge createEdge(Vertex sourceVertex, Vertex targetVertex) {
return new Edge(2);
}
};
// Create the graph
SimpleGraph<Vertex, Edge> graph = new SimpleGraph<Vertex, Edge>(
BOND_FACTORY);
// Create vertexes
Vertex v1 = new Vertex(1);
Vertex v2 = new Vertex(1);
// Add them to the graph
graph.addVertex(v1);
graph.addVertex(v2);
graph.addEdge(v1, v2);
問題は、グラフに追加しようとすることですv2
が、グラフに追加されないためv1.equals(v2) == true
v2
です。lib の JavaDoc から:
指定された頂点がまだ存在しない場合は、このグラフに追加します。より正式には、このグラフに u.equals(v) となる頂点 u が含まれていない場合、指定された頂点 v をこのグラフに追加します。
このチェックはここに実装されています。
しかし、それでは、どうすれば自分がやろうとしていることを達成できますか? このライブラリに使用できる別の実装がありますか、それともequals()
メソッドを変更するのは良い考えですか?