如何使用JGraphT引用自定义顶点以添加Edge

美林

我有一个图SimpleWeightedGraph<Vertex, DefaultWeightedEdge> g,其中顶点是一个自定义类。我在PostgreSQL空间数据库中拥有所有顶点和边缘。
我只需要加载其中的一个子集,即可从两个顶点中查找路径,因此我使用了一些查询。

Vertex类具有Stringas标识符和我从数据库加载的其他参数。以后我需要

我首先通过一些查询加载所有需要的顶点。第二次,我添加了边(以及其他查询),但是我需要引用图中已经存在的顶点。

现在的问题是:我该怎么做?

这是我的代码的一些摘录。

Vertex类:(
如果它们具有相同的ID,我希望Vertex是相等的,并且通过其ID以与String相同的自然顺序对其进行排序。我希望也可以这样做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之外的所有参数。

我该如何称呼他们?谢谢。

马可13

该图不明确知道有关id您存储在顶点中的任何信息特别是,它不知道这是Vertex以后应该识别对象的“关键” 当仅id已知顶点的顶点时,无法从图中“提取”现有顶点(除了迭代和检查每个顶点-即使对于较小的图也不可行)

一个非常简单实用的解决方案是将所有顶点存储在地图中。这样,您可以查找给定ID字符串的匹配顶点。

大致根据您的代码在此处绘制:

class TheClassThatLoadsTheGraph
{
    private final Map<String, Vertex> idToVertex =
        new LinkedHashMap<String, Vertex>();

    void readVertices()
    {
        ...
        rs = st.executeQuery(query);
        while (rs.next())
        {
            String id = "w"+rs.getInt("id_v");
            Vertex v = new Vertex(
                id, rs.getDouble("x"), rs.getDouble("y"), start.getA(), 0);
            g.addVertex(v);

            // Store the vertex in the map:
            idToVertex.put(id, v);
        }
    }

    void readEdges()
    {
        ...
        rs = st.executeQuery(query);
        while (rs.next())
        {
            String id1 = "w"+rs.getInt(1);
            String id1 = "w"+rs.getInt(2); 
            double weight = rs.getDouble(3);

            // Use the ids to look up the matching vertices
            Vertex v1 = idToVertex.get(id1);
            Vertex v2 = idToVertex.get(id2);
            DefaultWeightedEdge e = g.addEdge(v1, v2);

            g.setEdgeWeight(e, weight);
        }
    } 
}

注意:

您提到您想要该equals方法的特殊行为

我希望也可以做vertex.equals(“ something”))

严重破坏equals方法合同的情况下这是不可能的如果可以这样做,还必须确保

"something".equals(vertex);

但这显然不是事实。平等是一个非常重要的概念,正确实施该equals方法的细节可能很棘手。无论您打算在那里实现什么:尝试为此找到不同的方法(也许idToVertex上面代码片段中地图在这里也可能会有所帮助...)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

添加顶点的自定义名称

来自分类Dev

jgrapht的自定义边缘

来自分类Dev

如何使用自定义脚本在不使用Visual Studio的情况下添加/更新引用?

来自分类Dev

如何在R中的ggnet图中添加自定义顶点标签?

来自分类Dev

如何使用jQuery引用我自己的自定义属性

来自分类Dev

如何使用带有自定义属性的引用?

来自分类Dev

如何使用图纸交叉引用创建自定义列表?

来自分类Dev

如何在python igraph中为顶点标签使用自定义字体?

来自分类Dev

Amazon Neptune:如何使用tinkerpop / gremlinpython包在Python中创建自定义顶点ID?

来自分类Dev

如何使用热图顶点图中的数组值设置自定义工具提示?

来自分类Dev

如何在python igraph中为顶点标签使用自定义字体?

来自分类Dev

如何从顶点代码检查自定义设置的权限

来自分类Dev

使用自定义顶点标签打印增强图

来自分类Dev

使用自定义顶点声明对图元进行纹理处理

来自分类Dev

如何添加自定义类型定义?

来自分类Dev

如何添加自定义类型定义?

来自分类Dev

如何创建引用的自定义容器?

来自分类Dev

如何使用apache日志添加自定义变量?

来自分类Dev

Cordova 3.5.0如何使用CLI添加自定义插件?

来自分类Dev

如何使用代码添加自定义BizTalk持久点?

来自分类Dev

如何使用ggplots和地图添加自定义图例

来自分类Dev

如何使用Strapi在GraphQL中添加自定义查询?

来自分类Dev

如何使用jQuery的droppble函数添加自定义DIV?

来自分类Dev

如何使用自定义宽度动态添加RadioButton?

来自分类Dev

如何使用代码添加自定义BizTalk持久点?

来自分类Dev

BGL:如何从顶点迭代器获取自定义顶点属性类实例?

来自分类Dev

如何在Unity中使自定义检查器添加对象引用

来自分类Dev

如何添加自定义错误?

来自分类Dev

如何添加自定义字体?

Related 相关文章

  1. 1

    添加顶点的自定义名称

  2. 2

    jgrapht的自定义边缘

  3. 3

    如何使用自定义脚本在不使用Visual Studio的情况下添加/更新引用?

  4. 4

    如何在R中的ggnet图中添加自定义顶点标签?

  5. 5

    如何使用jQuery引用我自己的自定义属性

  6. 6

    如何使用带有自定义属性的引用?

  7. 7

    如何使用图纸交叉引用创建自定义列表?

  8. 8

    如何在python igraph中为顶点标签使用自定义字体?

  9. 9

    Amazon Neptune:如何使用tinkerpop / gremlinpython包在Python中创建自定义顶点ID?

  10. 10

    如何使用热图顶点图中的数组值设置自定义工具提示?

  11. 11

    如何在python igraph中为顶点标签使用自定义字体?

  12. 12

    如何从顶点代码检查自定义设置的权限

  13. 13

    使用自定义顶点标签打印增强图

  14. 14

    使用自定义顶点声明对图元进行纹理处理

  15. 15

    如何添加自定义类型定义?

  16. 16

    如何添加自定义类型定义?

  17. 17

    如何创建引用的自定义容器?

  18. 18

    如何使用apache日志添加自定义变量?

  19. 19

    Cordova 3.5.0如何使用CLI添加自定义插件?

  20. 20

    如何使用代码添加自定义BizTalk持久点?

  21. 21

    如何使用ggplots和地图添加自定义图例

  22. 22

    如何使用Strapi在GraphQL中添加自定义查询?

  23. 23

    如何使用jQuery的droppble函数添加自定义DIV?

  24. 24

    如何使用自定义宽度动态添加RadioButton?

  25. 25

    如何使用代码添加自定义BizTalk持久点?

  26. 26

    BGL:如何从顶点迭代器获取自定义顶点属性类实例?

  27. 27

    如何在Unity中使自定义检查器添加对象引用

  28. 28

    如何添加自定义错误?

  29. 29

    如何添加自定义字体?

热门标签

归档