[英]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
和地圖。
首先,你有一個動作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());
}
您的代碼中有兩個錯誤,導致無法正確打印結果。
錯誤 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.