【发布时间】:2014-06-23 09:44:29
【问题描述】:
我有一个来自 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;
}
【问题讨论】: