这是我下面的代码,当我执行它时,它显示了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中的对象是什么,以及如何检索这些对象?
发布于 2016-08-01 17:07:58
您错误地处理了context和地图。
首先,你有一个动作context和valueStack。
然后,您创建了一个名为context的映射并将其推送到堆栈。
然后,您已经开始对堆栈进行迭代,但是堆栈是一个不同的对象,它已经推送了context。
要从堆栈中取回上下文,您需要从valueStack中对其执行pop()或peek()。然后,您可以将其作为映射进行迭代。
代码:
context = (Map<String, Object>)stack.pop();
for (Map.Entry<String, Object> entry : context.entrySet()) {
System.out.println(entry.getKey() + ": " + entry.getValue());
}发布于 2016-08-01 18:10:15
您的代码中有两个错误,这两个错误导致无法正确打印结果。
错误n.1
i <= stack.size()应该是i < stack.size(),否则使用3个元素将尝试打印4个元素(i是从0开始的,size()是从1开始的)。
由于错误n.2,您不会遇到此错误。
错误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...
}https://stackoverflow.com/questions/38694405
复制相似问题