Какие объекты хранятся в ValueStack
Это мой код, когда я выполняю его, он показывает мне размер 3, но когда я выскакиваю объект, я получаю только 2 объекта. Пожалуйста, объясните мне, делаю ли я это неправильно? и я хочу знать, какие объекты хранятся в ValueStack
и как я могу получить эти объекты?
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;
}
}
2 ответа
Вы плохо обращались с контекстом и картой. Сначала вы получили контекст действия и valueStack
, Затем вы создали карту под названием context
и толкнул его в стек. Затем вы начали итерацию по стеку, но стек - это другой объект, который имеет context
толкнул Чтобы вернуть свой контекст из стека, вам нужно pop()
или же peek()
это из valueStack
, Тогда вы можете повторить это как Map
,
Код:
context = (Map<String, Object>)stack.pop();
for (Map.Entry<String, Object> entry : context.entrySet()) {
System.out.println(entry.getKey() + ": " + entry.getValue());
}
В вашем коде есть две ошибки, которые не позволяют правильно распечатать результат.
Ошибка №1
i <= stack.size()
должно быть i < stack.size()
иначе с 3 элементами вы попытаетесь напечатать 4 элемента (i
основано на 0, size()
основано на 1).
Вы не сталкиваетесь с этой ошибкой из-за ошибки n.2.
Ошибка № 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...
}