【问题标题】:What objects are stored in ValueStackValueStack 中存储了哪些对象
【发布时间】:2016-08-01 08:40:12
【问题描述】:

这是我下面的代码,当我执行时它显示大小为 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 :|
  • 是的,我只推送一个对象,值堆栈中的另一个对象是动作对象,所以这意味着只有 2 个对象,所以值堆栈的大小应该是 2,但它给了我3 作为对象的大小,这就是我关心的是我想知道为什么它显示大小为 3?
  • 值栈中有多个东西。例如,动作本身在到达视图层之前被压入堆栈。

标签: java struts2 iteration valuestack actioncontext


【解决方案1】:

你虐待了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());
}

【讨论】:

  • 其实你误会我了。我的意思是,当我打印对象的大小时,它给出 3 作为输出,但是当我从值堆栈中弹出对象时,我只得到 2 个对象。实际上想了解值堆栈中存储了哪些对象,而我只得到 2 个对象
  • 你打印堆栈的大小,而不是堆栈中对象的大小
  • 使用 stack.pop() 我试图检索堆栈中的对象。但无论如何,谢谢我得到了答案
  • 您应该只检索 (pop()) 已推送的对象,这才是重点。
  • @SachinSingh 是吗?你能给我一个链接吗?或者之前可能有人问过这个问题?
【解决方案2】:

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


错误 n.1

i &lt;= stack.size() 应该是 i &lt; 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...
}

【讨论】:

  • 感谢您指出这一点,但这是我试图检查它是否抛出任何异常,您会很高兴知道它没有抛出任何异常。你需要注意的另一件事是我没有使用 i 并且 peek 只返回堆栈中最顶层的元素
  • 感谢伙伴,但在 pop() 的情况下,它也不会抛出任何异常。但这不是我关心的问题,我通过使用 getroot() 方法得到了答案,它给了我 valuestack 中的 3 个对象,它们是 [{key3=This is key3, key2=This is key2, key1=This是 key1},com.sachin.HelloWorldAction@4e857327,com.opensymphony.xwork2.DefaultTextProvider@1b4b2db7] 感谢您的帮助
  • @SachinSingh 你得到了相同的对象并且大小没有改变,因为valueStack 是线程安全的。您只是使用另一种方法来检索对象,但 API 是相同的,但您在编写 Java 代码时遇到了很多错误。
  • 没有关于他为什么没有得到第三个元素的线索,也不是为什么它没有尝试得到一个不存在的第四个元素,然后是@RomanC。但是整个问答都很混乱,所以它可能就是一切
  • @AndreaLigios 你说得对。 int size = stack.size(); for (int i = 0; i
猜你喜欢
  • 2014-01-21
  • 1970-01-01
  • 2020-06-23
  • 1970-01-01
  • 2021-08-25
  • 2012-03-21
  • 1970-01-01
  • 2014-05-27
  • 1970-01-01
相关资源
最近更新 更多