2

SimpleWeightedGraph<Vertex, DefaultWeightedEdge> gVertex がカスタム クラスであるグラフがあります。postgresql 空間データベースにすべての頂点とエッジがあります。
2 つの頂点からのパスを見つけるには、それらのサブセットのみを読み込む必要があるため、いくつかのクエリを使用します。

Vertex クラスにはString、db からロードする as 識別子とその他のパラメーターがあります。後で必要になります。

最初に、必要なすべての頂点をいくつかのクエリで読み込みます。2 回目に (他のクエリを使用して) エッジを追加しますが、既にグラフにある頂点を参照する必要があります。

ここで質問:どうすればこれを作ることができますか?

ここに私のコードの抜粋があります。

Vertex クラス:
(同じ ID を持っている場合、Vertex は等しくなり、ID によって文字列と同じ自然な順序で並べられます。また、可能にしたいvertex.equals("something"))

public class Vertex implements Comparable<Vertex>{
    private String id;      //identifier
    private double x;       //x in SRID 900913
    private double y;       //y in SRID 900913
    private String geom;    //geome in EWKT
    private int a;
    private int p;

    public Vertex(String id, double x, double y){
        [...constructor body...]
    }
    public Vertex(String id, Vertex v){
        [...constructor body...]
    }
    public Vertex(String id, double x, double y, int a, int p){
        [...constructor body...]
    }
    public Vertice(String id){
        this.id = id;
    }

    @Override
    public boolean equals(Object obj){
            boolean result;

            if (obj == this) {
                return true;
            }
            if (obj == null) {
                return false;
            }

            if (obj.getClass() != String.class)
            {
                if (obj.getClass() != this.getClass()) {
                    return false;
                }
                Vertex v = (Vertex) obj;
                result = this.id.equals(v.getId()); 
            }
            else
            {
                String s = (String) obj;
                result = this.id.equals(s);
            }

            return result;
    }

    @Override
    public int hashCode(){
        final int prime = 31;

        int result = 1;

        result = prime * result + ((id == null) ? 0 : id.hashCode());

        return result;
    }

    @Override
    public String toString(){
        return this.id;
    }

    public int compareTo(Vertex v){
        return this.id.compareTo(v.getId());
    }

    [...other methods...]
}


グラフの頂点を作成するコードの別の部分の抜粋:

query = "select id_v, x, y from [table_name] where [conditions]";

rs = st.executeQuery(query);

while (rs.next())
{
    v = new Vertex("w"+rs.getInt("id_v"), rs.getDouble("x"), rs.getDouble("y"), start.getA(), 0);
    //start is a Vertex
    g.addVertex(v);
}

[...other parts of code like this one, but with different query...]


次に、エッジを作成する必要があります。コードは次のとおりです。

query = "select v1, v2, weight from [table_name] where [conditions]";

rs = st.executeQuery(query);

DefaultWeightedEdge e;
String v1;
String v2;

while (rs.next())
{
    v1 = "w"+rs.getInt(1);    //source_vertex_of_edge.equals(v1) is true
    v2 = "w"+rs.getInt(2);    //target_vertex_of_edge.equals(v2) is true
    weight = rs.getDouble(3);

    //the next line doesen't work because addEdge wants (Vertex, Vertex) as parameter
    e = g.addEdge(v1, v2);

    g.setEdgeWeight(e, weight);
}


私も試しました:

query = "select v1, v2, weight from [table_name] where [conditions]";

rs = st.executeQuery(query);

DefaultWeightedEdge e;
Vertex v1;
Vertex v2;

while (rs.next())
{
    v1 = new Vertex("w"+rs.getInt(1));    //source_vertex_of_edge.equals(v1) is true
    v2 = new Vertex("w"+rs.getInt(2));    //target_vertex_of_edge.equals(v2) is true
    weight = rs.getDouble(3);

    e = g.addEdge(v1, v2);

    g.setEdgeWeight(e, weight);
}


しかし、これは機能しません。エッジを追加すると、ソース頂点とターゲット頂点 (既にグラフにある) は、id 以外のすべてのパラメーターを失います。

それらをどのように参照できますか?ありがとう。

4

1 に答える 1