2016-06-28 2 views
0

私はまずオブジェクトをlistOfRatesに入れ、それをコピーしてinverseListOfRatesを作成したときにこの問題に気付きました。しかし、この方法を使用しても、私は他のリストを変更することなく一つのリストを変更することはできません。私は同じオブジェクトを含む2つのリストを持っています。他のリストを変更せずにリストを変更するにはどうすればよいですか?

この問題を解決するにはどうすればよいですか?

List<HistoricRate> listOfRates = new ArrayList<HistoricRate>(); 
List<HistoricRate> inverseListOfRates = new ArrayList<HistoricRate>(); 

for (HistoricRate rate : rates){ 
    listOfRates.add(rate); 
    inverseListOfRates.add(rate); 
} 

inverseListOfRates.forEach(r -> r.setMid(1/r.getMid())); 

答えて

5

2つのリストは同じオブジェクトを参照しています。したがって、最初のものを変更すると、2番目のものも変更されます。

解決策は、オブジェクトを2番目のリストに追加する前に、そのオブジェクトを複製して新しいインスタンスにコピーすることです。コピーによって

の1-コンストラクタ:

を使用すると、次の提案のいずれかを使用するか、オブジェクトのクローンを作成するには

class HistoricRate { 
    private String field; 

    public HistoricRate (HistoricRate another) { 
    this.field= another.field; // you can access 
    } 
} 

2 - HistoricRateがCloneableインタフェースを実装する必要があります

オブジェクトをコピーするメソッドcloneを実装します。以下のように

、3-使用org.apache.commons.lang.SerializationUtils:

for (HistoricRate rate : rates){ 
    listOfRates.add(rate); 
    inverseListOfRates.add(SerializationUtils.clone(rate)); 
} 
1

あなたは浅いコピー対深いコピーを理解する必要があります。

両方の配列リストは、ヒープ上の正確な同じオブジェクトを指しているので、他のリストには、まったく同じに指しているので、あなたは、レート円(オブジェクト)のいずれかを変更すると、あなたの配列は、このenter image description here

のように見えますそれに対応する索引にあるものは、他のリストで行った変更が表示されます。

public HistoricRate(HistoricRate other){ 
this.data = other.data; 
//copy the other instance variables here 
} 

、あなたのリストにHistoricRateさんを追加するときに、あなたがしているので、その後、あなたは

listOfRates.add(new HistoricRate(currentRate)); 

を追加することができます:あなたが行くHistoricRateクラスのコピーコンストラクタを定義する必要があり

'new'を使用すると、リストは新しいオブジェクトを受け取り、一方の変更は他方のものに影響しません。これは、この代わりのようになります:

enter image description here

関連する問題