使用JUNG在java中需要相同的对象

时间:2013-12-24 09:00:46

标签: java null nullpointerexception jung

我用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。 问候。

2 个答案:

答案 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才会返回边缘。

因此,nullcustomer之间获得neighbor边缘的原因不同。