我不知道如何准确地表达这个问题,但这正是我想要实现的(我正在使用堆栈实现河内塔的插图:
这在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);
这些是代表三极的堆栈:
Stack<Integer> pole1 = new Stack<Integer>();
Stack<Integer> pole2 = new Stack<Integer>();
Stack<Integer> pole3 = new Stack<Integer>();
我想根据用户输入更改堆栈,为此,我需要与变量pole1、pole2、pole3相关(以预执行任何操作,如pole1.pop()
)。
这就是我的问题:除了多个if()语句或switch-case语句之外,我如何使用用户输入(一个整数)来与极点相关?类似pole + "x".pop()
的东西?
好的解决方案
不要制造太多这样的变量。
你可以把它们都放在一个数组中:
Stack[] poles = new Stack[3];
for (int i=0; i<poles.length; i++) poles[i] = new Stack<Integer>();
然后,您可以使用poles[yourInteger]
访问您的电线杆。
一个变体(基于Jeffrey的评论):
List<Stack<Integer>> poles = new ArrayList<Stack<Integer>>();
for (int i=0; i<poles.size(); i++) poles[i] = new Stack<Integer>();
然后,您可以使用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);
疯狂的解决方案
如果你愿意的话,你可以使用reflection按名称访问你的变量。
为此,您首先获取类的Field实例:
Field stackField = MyClass.class.getField("pole"+myInteger);
然后,您必须获取该字段值的方法,并调用它们。这将是缓慢的,许多LOC和许多尝试/接球。