2

这是我下面的代码,当我执行时它显示大小为 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以及如何检索这些对象?

4

2 回答 2

3

你虐待了context和地图。

首先,你有一个动作contextvalueStack

然后您创建了一个名为的映射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());
}

于 2016-08-01T09:07:58.320 回答
2

您的代码中有两个错误,导致无法正确打印结果。


错误 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...
}
于 2016-08-01T10:10:14.677 回答