我用JUNG创建了一个大图。我想在每两个节点之间找到特定的有向边,并将边权重设置为特定参数。问题是findEdge方法,从创建的图形导出的边不相同(相同的值但不是同一个对象)。这个问题可能导致null指针异常!无论如何,我可以改变它作为相同的对象吗?!这是我的代码:
private void findNeighbors(Customer customer,
DirectedSparseGraph<Customer, Transaction> network) {
Collection<Customer> neighbors=network.getNeighbors(customer);
if(neighbors!=null){
for(Customer neighbor:neighbors){
Transaction edge=network.findEdge(customer, neighbor);
neighbor.setChurnProb(edge.getWeight());
churnedNet.add(neighbor);
}
}
}
在这种情况下,edge对象为null,它不应该是null。 问候。
答案 0 :(得分:2)
正如@whoAmI指出的那样,假设network
是定向的,你想要的是接班人而不是邻居。
然而,有一种更优雅和有效的方法。你真正想要的是外向边缘,所以直接要求它们:
for (Transaction transaction : network.getOutgoingEdges(customer)) {
// get the other customer for this transaction
Customer otherCustomer = network.getOpposite(customer, transaction);
otherCustomer.setChurnProb(transaction.getWeight());
churnedNet.add(customer);
}
您不应该询问传出边(或邻居)是否为空,因为如果没有边/邻居,它应该总是返回一个空集合。
那就是说,除非每个客户只有一个收到的交易,否则这个逻辑没有意义;否则每个传入边缘将设置其目标的churnProb值,并且仅保留最后一个值。你可能想看看这个。
答案 1 :(得分:1)
getNeighbors
返回所有邻居,即使边缘从邻居指向customer
。
customer
定向到neighbor
时, findEdge
才会返回边缘。
因此,null
和customer
之间获得neighbor
边缘的原因不同。