2012-07-19 55 views
0

我不知道如何精确短语这个问题,但是这是我想达到 (我用栈实现河内说明的塔是什么:如何使用户输入与变量相关?

这是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())。

这是我的问题:除了多个if()语句或switch case语句之外,我怎样才能将用户输入 - 一个整数 - 与极点相关?像pole + "x".pop()

回答

3

很好的解决

不要让这样的许多变量。

你可以把他们都在一个数组:

Stack[] poles = new Stack[3]; 
for (int i=0; i<poles.length; i++) poles[i] = new Stack<Integer>(); 

然后你就可以使用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)访问您的两极。

请注意,只要你开始在这些杆上做更复杂的事情,你就必须考虑将它们嵌入到一个类中。我个人试图避免集合或集合数组的集合,因为它们往往会令人困惑。

没有很好的解决方案

你可以使用一个开关:

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 stackField = MyClass.class.getField("pole"+myInteger); 

然后你必须得到这个字段的值的方法,并给他们打电话。这将是缓慢的,许多LOC和许多尝试/捕获。

+0

感谢您的快速回答,我应该想出使用堆栈数组来实现它更容易。无论如何,有没有办法实现我想要做的事? – amiregelz 2012-07-19 12:28:43

+0

@dystroy您不能制作通用数组。尝试'List >'。 – Jeffrey 2012-07-19 12:29:35

+0

@amiregelz是的,使用反射可以很容易地完成你想要的各种变量,也许我会将代码添加到我的答案中,但实际上,**不会!**。 – 2012-07-19 12:32:30