ValueStack 中存储了哪些对象以及如何检索这些对象?

问题描述 投票:0回答: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;
    }
}
 

请解释一下我是否做错了?

我想知道,

ValueStack
中存储了哪些对象以及如何检索这些对象?

java struts2 iteration valuestack actioncontext
2个回答
3
投票

您滥用了

context
和地图。

首先,您有一个动作

context
valueStack

然后您创建了一个名为

context
的地图并将其推送到堆栈中。

然后你已经开始迭代堆栈,但堆栈是一个不同的对象,它已被

context
推倒了。

要从堆栈中取回上下文,您需要从

pop()
peek()
获取上下文。然后你可以将其迭代为地图。

代码:

valueStack

    


2
投票


错误n.1

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。


错误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()

	
© www.soinside.com 2019 - 2024. All rights reserved.