簡體   English   中英

哪些對象存儲在 ValueStack 中

[英]What objects are stored in ValueStack

這是我下面的代碼,當我執行它時會顯示大小為 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存儲的對象是什么以及如何檢索這些對象?

你錯誤地對待了context和地圖。

首先,你有一個動作contextvalueStack

然后您創建了一個名為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());
}

您的代碼中有兩個錯誤,導致無法正確打印結果。


錯誤 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()方法獲取該getRoot()

Iterator itr = stack.getRoot().iterator();
while (itr.hasNext()) {
    System.out.println(itr.next().toString()); 
    // or .getClass().getName(), ReflectionToStringBuilder.toString(), or whatever...
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM