这是我下面的代码,当它执行时,它显示大小为 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;
}
}
请解释一下我是否做错了?
我想知道,
ValueStack
中存储了哪些对象以及如何检索这些对象?
您滥用了
context
和地图。
首先,您有一个动作
context
和 valueStack
。
然后您创建了一个名为
context
的地图并将其推送到堆栈中。
然后你已经开始迭代堆栈,但堆栈是一个不同的对象,它已被
context
推倒了。
要从堆栈中取回上下文,您需要从
pop()
或 peek()
获取上下文。然后你可以将其迭代为地图。代码:
valueStack
context = (Map<String, Object>)stack.pop();
for (Map.Entry<String, Object> entry : context.entrySet()) {
System.out.println(entry.getKey() + ": " + entry.getValue());
}
应该是
i <= stack.size()
,否则如果有 3 个元素,您将尝试打印 4 个元素(i < stack.size()
是从 0 开始的,i
是从 1 开始)。
您遇到此错误不是因为错误 n.2。
size()
堆栈的大小会在每次迭代时发生变化
System.out.println(i + ": " + stack.pop().toString());
:获取栈顶的对象并从栈中remove。 您应该在循环之前存储大小,因为否则
。 这就是正在发生的事情:
.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()