Тот же объект требуется в java с использованием JUNG

Я использовал JUNG для создания большого графика. Я хочу найти определенное направленное ребро между каждыми двумя узлами и установить вес ребра в качестве определенного параметра. Проблема заключается в методе findEdge, и ребра, которые экспортируются из созданного графа, не совпадают (одинаковое значение, но не один и тот же объект). Эта проблема может привести к исключению нулевого указателя! Могу ли я в любом случае изменить его на то, что он является одним и тем же объектом?! Вот мой код:

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);
            }
        }
    }

В этом случае объект края имеет значение null, которого не должно быть. С уважением.


person Ali    schedule 24.12.2013    source источник


Ответы (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 своей цели, и будет сохранено только последнее значение. Вы можете изучить это.

person Joshua O'Madadhain    schedule 25.12.2013

getNeighbors возвращает всех соседей, даже если ребро направлено от соседа к customer.

findEdge возвращает ребро, только если ребро направлено от customer к neighbor.

Таким образом, это различие является причиной получения null преимущества между customer и neighbor.

person BobTheBuilder    schedule 24.12.2013
comment
Проблема решается добавлением if(edge==null) edge=network.findEdge(neighbor, customer); - person Ali; 24.12.2013