为通用控制台菜单完善功能:
1. 增加“退出”功能,可以在任意位置放弃选择
2. 增加“返回到主菜单”功能,可以在任意深度回到主菜单,而不是逐级向上。3. 为每个叶子节点(就是最终执行命令)增加一个整数信息,将来选择结束时返回这个整数信息,而不是返回叶子节点的字符串。因为不同路径的字符串可能会是相同的内容。
import java.util.*;
public class MyTree {
private List<Node> lst = new ArrayList<Node>();
class Node {
String data;
String parent;
}
public void add(String parent, String child) {
Node t = new Node();
t.data = child;
t.parent = parent;
lst.add(t);
}
/*
* 得到根节点
* 返回根节点总是有问题,
* 要好好考虑一下返回null的问题
* 现在总是返回null
*/
public String getRoot(String x) {
for (int i = 0; i < lst.size(); i++) {
if (lst.get(i).data.equals(x)&&x!=null){
x = lst.get(i).parent;
return getRoot(x);
}
}
return null;
}
// 得到父节点
public String getParent(String x) {
for (int i = 0; i < lst.size(); i++) {
if (lst.get(i).data.equals(x))
return lst.get(i).parent;
}
return null;
}
public List<String> getChild(String x) {
List<String> t = new ArrayList<String>();
for (int i = 0; i < lst.size(); i++) {
if (lst.get(i).parent.equals(x))
t.add(lst.get(i).data);
}
return t;
}
}
import java.util.List;
import java.util.Scanner;
public class MyMenu {
MyTree tree = new MyTree();
public void add(String parent, String child) {
tree.add(parent, child);
}
public String go(String x) {
Scanner sc = new Scanner(System.in);
for (;;) {
List<String> list = tree.getChild(x);
if(list.isEmpty()){
return x;
}
System.out.println("-----------");
for (int i = 0; i < list.size(); i++) {
System.out.println(i + "." + list.get(i));
}
System.out.println("- - - - - -");
System.out.println("u.返回上一级");
System.out.println("m.返回主菜单");
System.out.println("e.退出");
System.out.println("-----------");
System.out.print("请输入选择:");
String s = sc.nextLine();
if(s.equals("m")){
String x1 = tree.getRoot(x);
x=x1;
continue;
}
if(s.equals("e")){
break;
}
if(s.equals("u")){
String x1 = tree.getParent(x);
if(x1 != null){
x=x1;
}
continue;
}
try {
String x1 = list.get(Integer.parseInt(s));
x = x1;
} catch (Exception e) {
System.out.println("请重新选择!");
}
}
return "退出";
}
public static void main(String[] args) {
MyMenu m = new MyMenu();
m.add("水果", "苹果");
m.add("水果", "香蕉");
m.add("水果", "葡萄");
m.add("苹果", "红富士苹果");
m.add("苹果", "国光苹果");
m.add("国光苹果", "富强1");
m.add("国光苹果", "富强2");
String t = m.go("水果");
System.out.println("您选择:" + t);
}
}
Conclusion
-----------
0.苹果
1.香蕉
2.葡萄
- - - - - -
u.返回上一级
m.返回主菜单
e.退出
-----------
请输入选择:0
-----------
0.红富士苹果
1.国光苹果
- - - - - -
u.返回上一级
m.返回主菜单
e.退出
-----------
请输入选择:1
-----------
0.富强1
1.富强2
- - - - - -
u.返回上一级
m.返回主菜单
e.退出
-----------
请输入选择:u
-----------
0.红富士苹果
1.国光苹果
- - - - - -
u.返回上一级
m.返回主菜单
e.退出
-----------
请输入选择:e
您选择:退出