2015-09-26 156 views
1

我正在编写一个程序,该程序生成一个迷宫,然后找到一个路径。我把所有的动作都储存在一个名为visitStack的堆栈中(如果我向北移动,则将“N”存储在其中,如果东北是“NE”,则继续)。对于我的回溯部分,我需要能够从堆栈中获取数据,如果我遇到了死胡同,那么我的步骤就会倒退,但我在这里遇到了一些麻烦。将对象分配给字符串

我需要从堆栈中弹出一个值到String变量,但我总是得到一个编译器错误。我试过使用toString,将String实例化为一个弹出栈值作为参数的对象,但仍然无法获取它。我已经在这上了大约一个小时。这是代码和错误消息。

String direction = visitStack.pop(); 

enter image description here

+0

你必须输入显式转换。字符串方向=(字符串)visitiStack.pop() – Shriram

+1

请在您的问题中添加一些关于'visitStack'的信息,以便您可以得到更准确的答案。 –

+0

如果你的堆栈中的每个元素都是一个字符串,那么可能应该输入“Stack ”?我们看不到剩下的代码,这使得它很难为你提供帮助,否则......(但是使用'toString()'会解决编译时错误,这意味着可能是别的什么时候错 - 但是,你还没有告诉我们什么。) –

回答

4

假设你正在使用java.util.Stack我怀疑你没有说明它应该存储什么类型的元素,这就是为什么编译器看到返回的pop类型为Object(所有的共同祖先类型)。

而且假设栈应该只存储字符串元素应该被声明为

Stack<String> visitStack = new Stack<String>(); 

现在的编译器应该看到的pop()返回类型为String,这将使你的结果存储在其他String型参考

String direction = visitStack.pop(); 

上述方案是喜欢红当你确信堆栈只能包含字符串,但如果有一些其他的元素,你将需要显式地强制转换返回的对象为String(如果您确信这将是字符串的情况下),如

String direction = (String) visitStack.pop(); 

,或者如果你不知道将返回什么对象调用toString()方法来获得它的字符串表示:如果你定义堆栈Stack<String>

String direction = visitStack.pop().toString(); 
1

pop()将返回String,你将不再需要弄乱阿鲁与铸造。如果你不能,因为某些原因,而你正被弹出的对象是String,你可以明确地投它:由于您使用的可能值的数量有限,您shloud使用类型ENUMS

String direction = (String)visitStack.pop(); 
+0

谢谢你的工作! –

-1

安全。

用途:

Stack<Direction> visitStack=new Stack<>(); 
visitStack.push(Direction.EAST); 

Direction dir=visitStack.peek(); 

String dir2=visitStack.pop().toString(); 

System.out.println(dir); 
System.out.println(dir2);  

你的方向应该是这样的:

public enum Direction { 
North("N"), NORTH_WEST("NW"), NORTH_EAST("NE"), EAST("E") 
, SOUTH_EAST("SE"), SOUTH("S"), SOUTH_WEST("SW"), WEST("W"); 

private String shortName; 

private Direction(String shortName) { 
    this.shortName = shortName; 
} 

@Override 
public String toString() { 
    return this.shortName; 
} 
} 
+0

这个枚举可以通过'private String shortName'字段来简化,构造函数将设置像North(“N”)'和toString(或其他方法),它将返回'shortName'。 – Pshemo

+0

@Pshemo完成修改,建议,谢谢。 – AsSiDe