我不知道如何精确地表达这个问题,但这是我想要实现的目标(我正在使用堆栈来实现河内塔的插图:
在main()函数内部:
main()
System.out.println("Type the source pole number and the destination pole number"); int a = reader.nextInt(); int b = reader.nextInt(); boolean move = moveDics(a, b);
这些是代表3个极点的堆栈:
Stack<Integer> pole1 = new Stack<Integer>(); Stack<Integer> pole2 = new Stack<Integer>(); Stack<Integer> pole3 = new Stack<Integer>();
我想根据用户输入来更改堆栈,为此,我需要与变量pole1,pole2,pole3相关联(以执行任何操作,如pole1.pop())。
pole1.pop()
这就是我的问题:除了多个if()语句或switch case语句之外,我如何使用用户输入-一个整数-与极点相关?像pole + "x".pop()什么?
pole + "x".pop()
好的解决方案
不要像那样做很多变量。
您可以将它们全部放在一个数组中:
Stack[] poles = new Stack[3]; for (int i=0; i<poles.length; i++) poles[i] = new Stack<Integer>();
然后,您可以使用访问极点poles[yourInteger]。
poles[yourInteger]
一个变体(基于杰弗里的评论):
List<Stack<Integer>> poles = new ArrayList<Stack<Integer>>(); for (int i=0; i<poles.size(); i++) poles[i] = new Stack<Integer>();
然后,您可以使用访问极点poles.get(yourInteger)。
poles.get(yourInteger)
请注意,一旦您开始在这些两极上做更复杂的事情,就必须考虑将它们嵌入到类中。我个人尝试避免使用集合或集合数组,因为它们容易造成混淆。
不是很好的解决方案
您可以使用一个开关:
public Stack<Integer> getPole(int i) { switch(myInteger) { case 1: return pole1; case 2: return pole2; case 3: return pole3 } return null; }
与它一起使用
Stack<Integer> pole = getPole(yourInteger);
疯狂的解决方案
您可以根据需要使用反射名来访问变量。
为此,您首先要获取类的Field实例:
Field stackField = MyClass.class.getField("pole"+myInteger);
然后,您必须获取该字段值的方法,然后调用它们。这将很慢,许多LOC和许多try / catch。