2012-11-25 37 views
2

我很新的Java和我在我的代码,在这里我想找到凯文·贝肯从演员到电影演员为影片的最短路径有问题。这存储在list中,其将变为"Actor A, Movie A, Actor B, Movie B, Kevin Bacon"。我认为这样做的最好方法就是去做recursively。但是,我得到StackOverflowErrorJava中的Kevin Bacon路径给出了堆栈溢出?

我存储演员在HashMap<String, HashSet<String>>电影。无论演员电影keys - 如果演员被调用,则返回电影演员一直处于一个HashSet,如果电影被调用,它返回一个HashSet演员它有。该findCostars方法找到所有演员给定演员已与联袂主演。

这是我的代码。任何帮助将被认真感谢!

public List<String> findBaconPath (String actor) throws IllegalArgumentException { 
    ArrayList<String> actors = new ArrayList<String>(); 
    actors.add(actor); 
    ArrayList<String> path = helper(actors, actor); 
    return path; 
} 

public ArrayList<String> helper(ArrayList<String> curr, String actor) { 
    ArrayList<String> list = new ArrayList<String>(); 
    HashSet<String> movies = myMovies.get(actor); 
    ArrayList<String> coStars = (ArrayList<String>) findCostars(actor); 
    Iterator<String> it = movies.iterator(); 
    while (it.hasNext()) { 
     String next = it.next(); 
     HashSet<String> movAct = myMovies.get(next); 
     if (movAct.contains("Bacon, Kevin")) { 
      list.add("Bacon, Kevin"); 
      list.add(next); 
      list.add(actor); 
      return list; 
     } else { 
      Iterator<String> itAct = coStars.iterator(); 
      while(itAct.hasNext()) { 
       curr.add(next); 
       String nextActorValue = itAct.next(); 
       curr.add(nextActorValue); 
       helper(curr, nextActorValue); 
      } 
     } 
    } 
    return null; 
} 
+1

你想那烂番茄的收视率和最小的最短路径或路径?如果是后者,你可能需要小心周围涉及* Tremors *续集的净负循环。 –

回答

2

由于搜索是深度优先的,并且不排除已经访问过的图形节点,所以会出现堆栈溢出。

因为你很可能要在最短的路径,尝试实施Breadth-first search

+0

嗯,谢谢!我如何去标记我已经访问过的演员?因为我拥有的是一个存储字符串和哈希集的散列表,是一种标记已经访问过的节点的方法吗? – user202925

+1

具体到你的算法因为标签是暂时的数据,你不希望弄乱它持久的电影/演员信息。您可以在搜索期间创建访问节点的临时哈希集。 –

0

你从不检查你不处理同一部电影两次。

第一次调用,便开始处理movies,第一次迭代可能会调用相同的方法为第一男主角和相同的电影。然后第二次调用将开始在movies上重新迭代...。