需求:
问题:
我用递归程序来实现该需求功能,其中遇到一个想不明白的问题,其问题还是用代码来说明吧。
正确的代码:
package com.org.mai;
import java.util.ArrayList;
public class Test {
public static void main(String[] args) {
ArrayList<String> routes = new ArrayList<>();
routes.add("s-1");
routes.add("1-2");
routes.add("1-3");
routes.add("2-4");
routes.add("3-4");
routes.add("4-e");
ArrayList<String> lines = new ArrayList<>();
getWfRouteLines("", routes, "", lines);
for (String line : lines) {
System.out.println(line);
}
}
/**
* 获取所有的路线
* @param s 前节点
* @param routes 存放 “前节点-后节点“ 格式值
* @param routeLine 正在组建的路线
* @param lineList 最终的所有路线
*/
public static void getWfRouteLines(String s, ArrayList<String> routes, String routeLine, ArrayList<String> lineList) {
ArrayList<String> routeTemp = (ArrayList<String>) routes.clone();
boolean flag = s.contains("e");
/* 正在组建路线 */
if (!flag) {
for (String route : routes) {
String routeLineTemp = routeLine;
// 前节点
String nodeS = route.split("-")[0];
// 后节点
String nodeE = route.split("-")[1];
/* 设置初始节点 */
if (nodeS.contains("s")) {
s = nodeS;
}
/* 筛选前节点,并组建路线 */
if (nodeS.equals(s)) {
/* 首次组建路线 */
if (routeLineTemp.isEmpty()) {
routeLineTemp += nodeS + ",";
}
routeLineTemp += nodeE + ",";
routeTemp.remove(route);
getWfRouteLines(nodeE, routeTemp, routeLineTemp, lineList);
}
}
}
/* 组建的路线中,如果有结束节点,则表示已经组建一条完整的路线 */
else {
lineList.add(routeLine.substring(0, routeLine.length() - 1));
}
}
}
输出的结果:
s,1,2,4,e
s,1,3,4,e
错误的代码:
package com.org.mai;
import java.util.ArrayList;
public class Test {
public static void main(String[] args) {
ArrayList<String> routes = new ArrayList<>();
routes.add("s-1");
routes.add("1-2");
routes.add("1-3");
routes.add("2-4");
routes.add("3-4");
routes.add("4-e");
ArrayList<String> lines = new ArrayList<>();
getWfRouteLines("", routes, "", lines);
for (String line : lines) {
System.out.println(line);
}
}
/**
* 获取所有的路线
* @param s 前节点
* @param routes 存放 “前节点-后节点“ 格式值
* @param routeLine 正在组建的路线
* @param lineList 最终的所有路线
*/
public static void getWfRouteLines(String s, ArrayList<String> routes, String routeLine, ArrayList<String> lineList) {
ArrayList<String> routeTemp = (ArrayList<String>) routes.clone();
boolean flag = s.contains("e");
/* 正在组建路线 */
if (!flag) {
String routeLineTemp = routeLine;
for (String route : routes) {
// 前节点
String nodeS = route.split("-")[0];
// 后节点
String nodeE = route.split("-")[1];
/* 设置初始节点 */
if (nodeS.contains("s")) {
s = nodeS;
}
/* 筛选前节点,并组建路线 */
if (nodeS.equals(s)) {
/* 首次组建路线 */
if (routeLineTemp.isEmpty()) {
routeLineTemp += nodeS + ",";
}
routeLineTemp += nodeE + ",";
routeTemp.remove(route);
getWfRouteLines(nodeE, routeTemp, routeLineTemp, lineList);
}
}
}
/* 组建的路线中,如果有结束节点,则表示已经组建一条完整的路线 */
else {
lineList.add(routeLine.substring(0, routeLine.length() - 1));
}
}
}
输出的结果:
s,1,2,4,e
s,1,2,3,4,e
想不明白问题在于 getWfRouteLines 方法中的代码 String routeLineTemp = routeLine; 的位置。
String routeLineTemp = routeLine; 放在 for (String route : routes) {} 循环体里面,能得到正确的结果
String routeLineTemp = routeLine; 放在 for (String route : routes) {} 循环体外,得到错误的结果
为什么?麻烦各位哥哥姐姐弟弟妹妹们,帮忙解答下,我实在是想不明白了@_@,谢谢啦。
(我是用递归的思路来实现该需求功能,如果大家还有其他好的思路,可以分享下,如果想分享的话。)