java ValueStack中存储了哪些对象
下面是我的代码,当我执行它时,它显示大小为3,但当我弹出对象时,我只得到2个对象
import java.util.*;
import com.opensymphony.xwork2.util.ValueStack;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
public class HelloWorldAction extends ActionSupport {
private static final long serialVersionUID = 1L;
private String name;
public String execute() throws Exception {
ValueStack stack = ActionContext.getContext().getValueStack();
Map<String, Object> context = new HashMap<String, Object>();
context.put("key1", new String("This is key1"));
context.put("key2", new String("This is key2"));
context.put("key3", new String("This is key3"));
stack.push(context);
System.out.println("Size of the valueStack: " + stack.size());
for (int i = 0; i < stack.size(); i++) {
System.out.println(i + ": " + stack.pop().toString());
}
return "success";
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
请解释一下我是否做错了
Wnd我想知道ValueStack
中存储的对象是什么,如何检索这些对象
# 1 楼答案
你虐待了
context
和一张地图首先,您得到一个动作
context
和valueStack
然后创建了一个名为
context
的映射,并将其推送到堆栈中然后开始迭代堆栈,但堆栈是另一个对象,它被
context
压过要从堆栈中获取上下文,需要
pop()
或peek()
从valueStack
中获取上下文。然后可以将其作为贴图进行迭代代码:
# 2 楼答案
代码中有两个错误,导致无法正确打印结果
错误n.1
i <= stack.size()
应该是i < stack.size()
,否则对于3个元素,您将尝试打印4个元素(i
基于0,size()
基于1)。由于错误n.2,您没有遇到此错误
错误n.2
然后应该在循环之前存储大小,否则堆栈的大小在每次迭代时都会改变
这就是正在发生的事情:
工作代码
这将正确打印结果,但会改变值堆栈;为了避免这种情况,您应该在迭代器中循环值堆栈的对象,您可以使用
getRoot()
方法获得该迭代器: