2

これは以下の私のコードです。実行するとサイズが 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どのようなオブジェクトが格納されているか、またそれらのオブジェクトを取得するにはどうすればよいかを知りたいです。

4

2 に答える 2

2

コードに 2 つのエラーがあり、結果が正しく出力されません。


エラー 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()それを防ぐには、メソッドで取得できるイテレータ内から値スタックのオブジェクトをループする必要があります。

Iterator itr = stack.getRoot().iterator();
while (itr.hasNext()) {
    System.out.println(itr.next().toString()); 
    // or .getClass().getName(), ReflectionToStringBuilder.toString(), or whatever...
}
于 2016-08-01T10:10:14.677 に答える