0

同じメモリを指さずに、ある配列の内容を別の配列にコピーしようとしていますが、できません。

私のコード:

class cPrueba {
    private float fvalor;

    public float getFvalor() {
        return fvalor;
    }

    public void setFvalor(float fvalor) {
        this.fvalor = fvalor;
    }
}

List<cPrueba> tListaPrueba = new ArrayList<cPrueba>();
List<cPrueba> tListaPrueba2 = new ArrayList<cPrueba>();

cPrueba tPrueba = new cPrueba();
tPrueba.setFvalor(50);
tListaPrueba.add(tPrueba);

tListaPrueba2.addAll(tListaPrueba);
tListaPrueba2.get(0).setFvalor(100);

System.out.println(tListaPrueba.get(0).getFvalor());

結果は「100.0」……。

まだ同じオブジェクトを指しています...コピーする簡単な方法はありますか? (for(..){} なし)

編集:

class cPrueba implements Cloneable {
    private float fvalor;

    public float getFvalor() {
        return fvalor;
    }

    public void setFvalor(float fvalor) {
        this.fvalor = fvalor;
    }

    public cPrueba clone() {
        return this.clone();
    }
}

List<cPrueba> tListaPrueba = new ArrayList<cPrueba>();
List<cPrueba> tListaPrueba2 = new ArrayList<cPrueba>();

cPrueba tPrueba = new cPrueba();
tPrueba.setFvalor(50);
tListaPrueba.add(tPrueba);

for ( cPrueba cp : tListaPrueba )
    tListaPrueba2.add(cp);

tListaPrueba2.get(0).setFvalor(100);

System.out.println(tListaPrueba.get(0).getFvalor());

それでも100になる…

4

3 に答える 3

5

配列を「ディープコピー」する方法はありません。また、オブジェクト自体がディープ コピーをサポートしていない場合でも (たとえば、コピー コンストラクターを介して) Collection、配列を "ディープコピー" する方法はありません。ListMap

だから、あなたの質問に:

コピーする簡単な方法はありますか? (for(..){} なし)

答えはノーだ。

もちろん、オブジェクトが不変であれば、これは問題ではありません。

于 2013-06-01T15:21:44.043 に答える
1

dystroy が言ったように、次のように、ループを通過してすべてのオブジェクトを複製する必要があります。

List<cPrueba> newList = new ArrayList<cPrueba>();
for ( cPrueba cp : oldList )
    newList.add(cp.clone());

それは、オブジェクトが Cloneable を実装しているか、少なくとも clone というメソッドを持っていることを前提としています。

いいえ、短い方法はありませんが (独自の静的メソッドを作成しない限り)、それは可能です。

EDIT新しいcPruebaを返すには、クローンメソッドが必要です:

public cPrueba clone() {
    cPrueba c = new cPrueba();
    c.setFvalor(this.getFvalor());
    return c;
}

また、必ずcp.clone()for ループを呼び出してください。cp を add メソッドに渡すだけではいけません。例: 変更

tListaPrueba2.add(cp);

tListaPrueba2.add(cp.clone());
于 2013-06-01T15:24:08.953 に答える
0

バニラ Java はこれを行うことができません。

しかし、少しスパイスを加えることで、Dozer フレームワークでそれを実現できます。

http://dozer.sourceforge.net/

于 2013-06-01T15:28:54.850 に答える