Адаптация псевдокода к реализации Java для поиска самого длинного слова в дереве

Ссылаясь на этот вопрос, я задал: Как найти самое длинное слово в попробовать?

У меня возникли проблемы с реализацией псевдокода, указанного в ответе.

findLongest(trie):
 //first do a BFS and find the "last node"
 queue <- []
 queue.add(trie.root)
 last <- nil
 map <- empty map
while (not queue.empty()):
 curr <- queue.pop()
 for each son of curr:
    queue.add(son)
    map.put(son,curr) //marking curr as the parent of son
 last <- curr
//in here, last indicate the leaf of the longest word
//Now, go up the trie and find the actual path/string
curr <- last
str = ""
while (curr != nil):
      str = curr + str //we go from end to start   
    curr = map.get(curr)
return str

Это то, что у меня есть для моего метода

public static String longestWord (DTN d) {
  Queue<DTN> holding = new ArrayQueue<DTN>();
  holding.add(d);
  DTN last = null;
  Map<DTN,DTN> test = new ArrayMap<DTN,DTN>();
  DTN curr;
  while (!holding.isEmpty()) {
       curr = holding.remove();

      for (Map.Entry<String, DTN> e : curr.children.entries()) {
          holding.add(curr.children.get(e));
          test.put(curr.children.get(e), curr);
      }
          last = curr;

      }
  curr = last;
  String str = "";
  while (curr != null) {
      str = curr + str;
      curr = test.get(curr);

  }
  return str;

  }

Я получаю исключение NullPointerException по адресу:

 for (Map.Entry<String, DTN> e : curr.children.entries())

Как найти и исправить причину NullPointerException метода, чтобы он возвращал самое длинное слово в дереве?


person user1766888    schedule 04.11.2012    source источник


Ответы (2)


Убедитесь, что curr.children.entries() не является нулевым значением. Возможно, DTN возвращает нулевое значение, если у этого узла нет потомков. Это приведет к тому, что ваш NullPointerException.

Попробуйте сделать быструю проверку, прежде чем начать итерацию.

if(curr.children.entries() != null)
{
    //It's safe, so procede with going deeper into the trie.
}
person Clark    schedule 04.11.2012

В дополнение к ответу @Clark убедитесь, что curr.children не равен нулю, прежде чем разыменовывать его.

person user207421    schedule 04.11.2012