我有一个来自 mysql 数据库的结果集,我正在尝试使用这些值构建 JUNG 图。我已经将我的空图实例化为:
Graph<Node, Edge> g = new SparseMultigraph<>();
然后我添加了节点(586)。我现在正在添加链接,现在事情变得更加复杂。我的自定义 Edge 的结构非常简单,它只有一个“时间”属性,例如:
Multiset<Timestamp> time;
链接的结果集包含 3273684 个条目,格式如下:
id time sender receiver
12 2014-03-20 09:26:04.000 2 99
现在,我想要做的是,如果链接不存在,则从 id 2 的节点和 id 99 的节点创建一个链接,或者仅将时间戳添加到已存在的链接中。我所做的是:
while (resultSet.next()) {
// retrieve sender
Node sender = findNode(resultSet.getInt("sender"), g);
// retrieve receiver
Node receiver = findNode(resultSet.getInt("receiver"), g);
// if they are already linked
if(g.isPredecessor(sender, receiver)){
// just add the new timestamp to the existing link
Collection<Edge> outEdges = g.getOutEdges(sender);
// find the right edge
for(Edge e:outEdges){
// if this edge is connected to receiver
if(g.getDest(e).equals(receiver)){
// add the new timestamp to this edge
e.setTime(resultSet.getTimestamp("time"));
}
}
} else { // else a new link is added
Information e = new Information();
e.setId(resultSet.getInt("id"));
e.setTime(resultSet.getTimestamp("time"));
g.addEdge(e, sender, receiver, EdgeType.DIRECTED);
}
}
我的问题是这真的很慢,而且我不明白这是否正常,因为结果集很大,或者我是否缺少一种更清晰/更快的方法来实现我需要的东西。
为了清楚起见,我的 findNode() 方法是这样的:
private static Node findNode(int aInt, Graph<Node, Edge>g) {
for(Node n:g.getVertices()){
if(n.getId()== aInt){
return n;
}
}
return null;
}
最佳答案
这很慢有两个原因:
(1) 您没有有效的方法来查找给定 ID 的节点。对于这种大小的图表,我建议在填充图表时构建一个映射,并使用该映射来实现 findNode()。
(2) 一旦有了两个节点,并且想要获取连接它们的边(如果有),只需使用 Graph.findEdge() 即可。
(1) 是迄今为止代码缓慢的最大原因。 (2) 不会有太大帮助,但它也会让你的代码更容易阅读、更优雅。
关于java - 如何向 JUNG 图表添加链接或更新现有链接属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24362841/