首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >哪些对象存储在ValueStack中

哪些对象存储在ValueStack中
EN

Stack Overflow用户
提问于 2016-08-01 16:40:12
回答 2查看 201关注 0票数 2

这是我下面的代码,当我执行它时,它显示了3的大小,但当我弹出对象时,我只得到了2个对象。

代码语言:javascript
复制
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中的对象是什么,以及如何检索这些对象?

EN

回答 2

Stack Overflow用户

发布于 2016-08-01 17:07:58

您错误地处理了context和地图。

首先,你有一个动作contextvalueStack

然后,您创建了一个名为context的映射并将其推送到堆栈。

然后,您已经开始对堆栈进行迭代,但是堆栈是一个不同的对象,它已经推送了context

要从堆栈中取回上下文,您需要从valueStack中对其执行pop()peek()。然后,您可以将其作为映射进行迭代。

代码:

代码语言:javascript
复制
context = (Map<String, Object>)stack.pop();
for (Map.Entry<String, Object> entry : context.entrySet()) {
    System.out.println(entry.getKey() + ": " + entry.getValue());
}
票数 3
EN

Stack Overflow用户

发布于 2016-08-01 18:10:15

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

错误n.1

i <= stack.size()应该是i < stack.size(),否则使用3个元素将尝试打印4个元素(i是从0开始的,size()是从1开始的)。

由于错误n.2,您不会遇到此错误。

错误2号

代码语言:javascript
复制
System.out.println(i + ": " + stack.pop().toString());

.pop():获取堆栈顶部的对象,并将其从堆栈中移除。

然后,您应该在循环之前存储该大小,否则在每次迭代时,堆栈的大小都会发生变化。

这就是正在发生的事情:

代码语言:javascript
复制
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.

工作代码

代码语言:javascript
复制
int size = stack.size();

for (int i = 0; i < size; i++) {
    System.out.println(i + ": " + stack.pop().toString());
}

这将正确地打印结果,但是它会改变值堆栈;为了防止这种情况,您应该从迭代器中循环值堆栈的对象,可以使用getRoot()方法获得该对象:

代码语言:javascript
复制
Iterator itr = stack.getRoot().iterator();
while (itr.hasNext()) {
    System.out.println(itr.next().toString()); 
    // or .getClass().getName(), ReflectionToStringBuilder.toString(), or whatever...
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38694405

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档