因此,我正在编写一个程序,将一个人从地铁系统的一个站点转到另一个站点。这是想法:
它给了我无法解决的堆栈溢出。尝试调试无济于事。
public ArrayList<Station> findRoutesBetween(Station start, Station target) {
ArrayList<Station> path = new ArrayList<Station>();
for (Route route : findRoutes(start)) {
ArrayList<Station> stops = route.getStops();
boolean sameRoute = findRoutes(target).contains(route);
int stopIdstart = stops.indexOf(start);
int stopIdtarget = stops.indexOf(target);
if (sameRoute && stops.contains(start)) {
if (stopIdtarget > stopIdstart) {
path.addAll((stops.subList(stopIdstart, stopIdtarget + 1)));
return path;
} else {
List<Station> temp = stops.subList(stopIdstart, stopIdtarget + 1);
Collections.reverse(temp);
path.addAll(temp);
return path;
}
} else {
if (stopIdstart != stops.size() - 1) {
System.out.println("hh");
ArrayList<Station> t = findRoutesBetween(stops.get(stopIdstart + 1), target);
System.out.println(t.toString());
}
if (stopIdstart != 0) {
System.out.println("hh");
ArrayList<Station> t = findRoutesBetween(stops.get(stopIdstart - 1), target);
System.out.println(t.toString());
}
}
}
return path;
}
函数findroutes()仅返回停止点所在的所有行。
答案 0 :(得分:0)
您的实施不会忽略您已经检查或继续的站。这意味着您有时可能会通过给定的路线从车站A到达车站B。然后,当您在B站时,请检查所有可能的站并再次查看A站。然后,您再次回到A站,重新开始并再次找到B站。现在,您将在无休止的递归方法调用中在这些工作站之间来回跳转,直到获得StackOverflowError
。
保留已检查的电台列表,并且在列表中不再检查电台。所以你会得到类似的东西:
好的,我在K站,根据可用路线查看R,G,W,Z,C,I和L站。但是,我已经跳过了电台W,Z和C。因此,让我们接下来仅检查R,G,I和L站...
出于调试目的,您可以打印输入到方法中的参数(或来自Station
对象的某些数据,例如站名)。这样一来,您可能已经注意到,您看到相同的工作站重复进入方法。