我有一个来自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;
}
答案 0 :(得分:1)
这有点慢,原因有两个:
(1)您没有一种有效的方法来查找给定ID的节点。对于此大小的图表,我建议您在填充图表时构建Map,并使用该映射来实现findNode()。
(2)一旦有了两个节点,并且想要获得连接它们的边缘(如果有的话),只需使用Graph.findEdge()。
(1)是目前代码速度较慢的最大原因。 (2)没有那么多帮助,但它也会使你的代码更容易阅读和更优雅。