首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用GraphStream继承在图中存储数据

如何使用GraphStream继承在图中存储数据
EN

Stack Overflow用户
提问于 2018-04-23 12:20:28
回答 1查看 297关注 0票数 1

在题为“GraphStream教程”的

代码语言:javascript
复制
Storing, retrieving and displaying data in graphs

它规定:-

代码语言:javascript
复制
Other ways to store data on graphs
Sometimes you want to create your own graph structure and inherit the Node and Edge classes to create your own. In this case you will probably not store the data under the form of key-value attributes but inside fields of the classes you define. Both ways, key-value or inheritance, have their advantages and drawbacks.

我试图使用继承(通过扩展org.graphstream.graph.implementations.SingleNode)

我的代码测试失败了

代码语言:javascript
复制
org.graphstream.graph.ElementNotFoundException

我创建了两个自定义的“DataNode”,如下所示:

代码语言:javascript
复制
final Node dataNode1 = DataNode.builder().graph(GRAPH).id("One").stringData("StringData_1").integerData(1).build();
final Node dataNode2 = DataNode.builder().graph(GRAPH).id("Two").stringData("StringData_2").integerData(2).build();

然后试图在他们之间创造一个“边缘”..。

代码语言:javascript
复制
GRAPH.addEdge("Some", dataNode1, dataNode2);

我的图表定义如下:

代码语言:javascript
复制
private static final SingleGraph GRAPH = new SingleGraph("Data");

它的配置如下:

代码语言:javascript
复制
GRAPH.setStrict(false);
GRAPH.setAutoCreate(true);
GRAPH.addAttribute("ui.quality");
GRAPH.addAttribute("ui.antialias");

如何使用继承来存储自定义数据属性。

代码语言:javascript
复制
// https://mvnrepository.com/artifact/org.graphstream/gs-core
compile group: 'org.graphstream', name: 'gs-core', version: '1.3'
// https://mvnrepository.com/artifact/org.graphstream/gs-ui
compile group: 'org.graphstream', name: 'gs-ui', version: '1.3'

我的DataNode课程类似于:-

代码语言:javascript
复制
public class DataNode extends SingleNode {

    private final String mStringData;
    private final Integer mIntegerData;

    public DataNode(final AbstractGraph graph, final String id, final Builder builder) {
        super(graph, id);
        this.mStringData = builder.getStringData();
        this.mIntegerData = builder.getIntegerData();
    }

    /**
     * @return the mStringData
     */
    public String getStringData() {
        return mStringData;
    }

    /**
     * @return the mIntegerData
     */
    public Integer getIntegerData() {
        return mIntegerData;
    }

    public static Builder builder() {

        return new Builder();
    }

    public static class Builder {

        private AbstractGraph graph;
        private String id;

        private String mStringData;
        private Integer mIntegerData;

        /**
         * @param graph
         *            the graph to set
         */
        public Builder graph(final AbstractGraph graph) {
            this.graph = graph;
            return this;
        }

        /**
         * @param id
         *            the id to set
         */
        public Builder id(final String id) {
            this.id = id;
            return this;
        }

        /**
         * @param mStringData
         *            the mStringData to set
         */
        public Builder stringData(final String mStringData) {
            this.mStringData = mStringData;
            return this;
        }

        /**
         * @param mIntegerData
         *            the mIntegerData to set
         */
        public Builder integerData(final Integer mIntegerData) {
            this.mIntegerData = mIntegerData;
            return this;
        }

        /**
         * @return the graph
         */
        public AbstractGraph getGraph() {
            return graph;
        }

        /**
         * @return the id
         */
        public String getId() {
            return id;
        }

        /**
         * @return the mStringData
         */
        public String getStringData() {
            return mStringData;
        }

        /**
         * @return the mIntegerData
         */
        public Integer getIntegerData() {
            return mIntegerData;
        }

        public DataNode build() {
            return new DataNode(graph, id, this);
        }
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-04-23 16:09:32

如果您不完全需要节点子类的字符串和整数字段是最终的,那么您可以为该图设置一个新的节点工厂。

扩展节点会更简单:

代码语言:javascript
复制
class DataNode extends SingleNode {
    private  String mStringData;
    private  Integer mIntegerData;
    public DataNode( AbstractGraph graph, final String id) {
        super(graph, id);
    }
    public void setStringData(String mStringData) {
        this.mStringData = mStringData;
    }
    public void setIntegerData(Integer mIntegerData) {
        this.mIntegerData = mIntegerData;
    }
    public String getStringData() {
        return mStringData;
    }
    public Integer getIntegerData() {
        return mIntegerData;
    }
}

然后可以使用节点工厂:

代码语言:javascript
复制
GRAPH.setNodeFactory(new NodeFactory<Node>() {
    @Override
    public Node newInstance(String id, Graph graph) {
        return new DataNode((AbstractGraph) graph, id);
    }
});

或者java 8版本:

代码语言:javascript
复制
GRAPH.setNodeFactory((id, graph) -> new DataNode((AbstractGraph)graph, id));

最后创建节点,然后设置属性(这就是它们不能成为最终属性的原因):

代码语言:javascript
复制
final Node dataNode1 = GRAPH.addNode("One");
((DataNode)dataNode1).setStringData("StringData_1");
((DataNode)dataNode1).setIntegerData(1);

final Node dataNode2 = GRAPH.addNode("Twi");
((DataNode)dataNode1).setStringData("StringData_2");
((DataNode)dataNode1).setIntegerData(2);

GRAPH.addEdge("Some", dataNode1, dataNode2);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49980954

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档