这个我的代码,当我执行它时显示我的大小为3,但当我弹出对象时,我只得到2个对象。
请解释一下我是否做错了?
我想知道 ValueStack
中存储的对象是什么,如何检索这些对象?
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;
}
}
答案 0 :(得分:2)
您错误地处理了上下文和地图。首先,您获得了一个动作上下文valueStack
。然后,您创建了一个名为context
的地图,并将其推送到堆栈。然后你开始迭代堆栈,但堆栈是一个推翻context
的不同对象。要从堆栈中恢复上下文,您需要pop()
或peek()
来自valueStack
。然后,您可以将其迭代为Map
。
代码:
context = (Map<String, Object>)stack.pop();
for (Map.Entry<String, Object> entry : context.entrySet()) {
System.out.println(entry.getKey() + ": " + entry.getValue());
}
答案 1 :(得分:1)
您的代码中存在两个错误,即阻止正确打印结果。
错误n.1
i <= stack.size()
应为i < stack.size()
,否则有3个元素,您将尝试打印4个元素(i
从0开始,size()
从1开始)。
由于错误n.2。您没有遇到此错误。
错误n.2
System.out.println(i + ": " + stack.pop().toString());
.pop()
:将对象放在堆栈顶部,然后从堆栈中删除。
然后你应该在循环之前存储大小,否则每次迭代时堆栈的大小都会改变。
这就是发生的事情:
for (int i = 0; i <= 3; i++) {
for (int i = 1; i <= 2; i++) {
for (int i = 2; i <= 1; i++) { // not performed. And you don't fall in error n.1.
工作代码
int size = stack.size();
for (int i = 0; i < size; i++) {
System.out.println(i + ": " + stack.pop().toString());
}
这将正确打印结果,但它会改变值堆栈;为了防止这种情况,你应该从迭代器中循环值栈的对象,你可以使用getRoot()
方法获得:
Iterator itr = stack.getRoot().iterator();
while (itr.hasNext()) {
System.out.println(itr.next().toString());
// or .getClass().getName(), ReflectionToStringBuilder.toString(), or whatever...
}