我对Java很陌生,我的代码中存在问题,我想找到从 actor到电影到演员到电影到Kevin Bacon 的最短路径。这存储在list
"Actor A, Movie A, Actor B, Movie B, Kevin Bacon"
中。recursively
我认为这样做的最好方法是StackOverflowError
。但是,我得到HashMap<String, HashSet<String>>
。
我将演员和电影存储在keys
中。 actors 和 movies 都是HashSet
- 如果调用了 actor ,那么它将返回<{1}}的< em> movies actor 已经进入,如果 movie 被调用,它将返回 actor的HashSet
它有。 findCostars
方法查找给定 actor 所有 actor 。
这是我的代码。任何帮助都会受到重视!
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;
}
答案 0 :(得分:2)
您的堆栈溢出是因为您的搜索是深度优先的,并且您不会排除已经访问过的图形节点。
由于您可能想要最短路径,请尝试实施Breadth-first search。
答案 1 :(得分:0)
您永远不会检查您是否两次不处理同一部电影。
第一次调用将开始处理movies
,第一次迭代可能会为第一个actor和相同的电影调用相同的方法。然后第二次调用将开始在movies
....