我正在编写一个生成迷宫然后找到路径的程序。我将所有动作存储到一个名为visitStack
的堆栈中(如果我向北移动,我将“N”存储到其中,如果是东北则将“NE”存储在其中)。对于我的回溯的一部分,我需要能够从堆栈中获取数据,并且如果我走到了死胡同,我可以反转我的步骤,但是我在这里遇到了麻烦。
我需要将从堆栈弹出的值分配给String
变量,但我总是遇到编译器错误。我已经尝试使用toString
,将弹出的堆栈值作为参数实例化为一个对象,但仍然无法获取它。我已经在这上面了大约一个小时。这是代码和错误消息。
String direction = visitStack.pop();
答案 0 :(得分:4)
假设您正在使用java.util.Stack
我怀疑您没有描述它应该存储的元素类型,这就是编译器将返回类型pop
视为Object
的原因(常见)所有类型的祖先。)
还假设堆栈应该只存储String元素,它应该声明为
Stack<String> visitStack = new Stack<String>();
现在编译器应该看到pop()
的返回类型为String
,这样您就可以将结果存储在其他String
类型引用中
String direction = visitStack.pop();
当您确定堆栈只能包含字符串时,上面的解决方案是 首选 ,但是如果还有其他一些元素,则需要将返回的对象显式转换为String (如果你确定它将是String的实例),如
String direction = (String) visitStack.pop();
或者如果您不确定将返回哪个对象调用toString()
方法来获取其字符串表示形式:
String direction = visitStack.pop().toString();
答案 1 :(得分:1)
如果您将堆栈定义为Stack<String>
,pop()
将返回String
,您无需乱扔乱码。如果由于某种原因你不能,并且你肯定是弹出的对象是String
,你可以明确地转换它:
String direction = (String)visitStack.pop();
答案 2 :(得分:-1)
由于您使用的是有限数量的可能值,因此您需要使用ENUMS作为安全类型。
使用:
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;
}
}