0

編集:うまくいけばコードをより明確にするために、私はこの質問を書き直しています。

2つの変数を持つクラスPredがあります。

public class Pred {

    private String str;
    private ArrayList<Keys> keysArr;

    public Pred(String s) {
        this.str = s;
        keysArr = new ArrayList<Keys>;
    }

    public void setKeysArr(ArrayList<Keys> kArr) {
        this.keysArr.addAll(kArr);
    }
}

extract()メソッドでは、別の配列をループし、いくつかの変数を取得し、これらを使用して新しいを作成しPredsます。

public static Collection<Pred> extractPause(Keys[] kseArr) {

    Collection<Pred> predArray = new ArrayList<Pred>(); 

    // create method variables
    ArrayList<Keys> keysArray ka = new ArrayList<Keys>();
    String s = "";

    // loop through an array
    for (int i; i < someArray.size(); i++) {
        s = "Sam"+i;
        ka.add(key1+i);
        ka.add(key2+i);

        // create new instance of Pred
        Pred p = new Pred(s);
        p.setKeysArr(ka);
        predArray.add(p);

        // reset variables (not sure if that's necessary)
        s = "";
        ka.clear();

    }
    return predArray;
}

の配列を出力しようとするとPreds、奇妙な状況に遭遇します。そこでは、の最後の配列値のみを取得してPredpredArrayます。

public void print() {
    for (Pred p : predArry)
        System.out.println(p.str+" "+p.get(p.keysArr.size()-1).getKeys());
}

出力:

Sam1 key12 key2  
Sam2 key12 key22  

する必要があります:

Sam1 key11 key21  
Sam2 key12 key22  
4

2 に答える 2

3

おそらく、Fooインスタンスのリストを作成するときに、

Foo foo = new Foo();
for (int i = 0; i < 10; i++) {
    foo.setBarStr("hello " + i);
    foo.setKeyArray(...);
    list.add(foo);
}

する代わりに

for (int i = 0; i < 10; i++) {
    Foo foo = new Foo();
    foo.setBarStr("hello " + i);
    foo.setKeyArray(...);
    list.add(foo);
}

リストには、オブジェクトのコピーではなく、オブジェクトへの参照が含まれていることに注意してください。したがって、同じFooインスタンスをリストに10回追加すると、リストにはこの一意のインスタンスへの10個の参照が含まれ、もちろん最後に変更された状態が含まれます。

于 2012-12-15T16:40:17.160 に答える
1

問題は印刷機能にあると思います。getまたはgetKeys関数が何をするのかわかりませんが、異なるキー値を持つ他のPredオブジェクトが存在する場合でも、同じオブジェクトからキーを取得していると思います。

System.out.println(p.str+" "+p.get(p.keysArr.size()-1).getKeys());

ここにタイプミスがあり、

predArry.get(...)

コードでは、常に同じPredオブジェクトを取得しているため、同じキー値を取得し続ける理由がわかります。インデックスp.keysArr.size()-1は、これらのオブジェクトのいずれに対しても変更されないためです。上記の例では、p.keysArr.size()-1は常に1であり、Predオブジェクトの配列(PredArry)から同じPredオブジェクトを取得し続けます。

于 2015-01-20T15:25:45.703 に答える