Какие объекты хранятся в 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...
}
Другие вопросы по тегам