2017-12-06 22 views
0

私はarrylist aに特定のオブジェクトが含まれています。私はまた、これらのオブジェクトのいくつかを含むarraylistsを含むarraylist bを持っています。今、私はarraylists aを複製し、arraylist bの参照をクローンオブジェクトに更新したいと思います。擬似コードの例:古いオブジェクトがbに存在する場合、各クローンを作成した後同じオブジェクトを参照する複数のarraylistsをクローニングする

for(int i = 0; i < a.length; i++){ 
    o = a.get(i); 
    aClone.set(i, o); 
    for(int j = 0; j < b.length){ 
     for(int k = 0; k < b.get(j).length){ 
      if(b.get(j).get(k).value() == o.value()) 
       bClone.get(j).set(k, o); 
     } 
    } 
} 

このコードをチェックし、そしてクローンに置き換え:私が思いついた

a = [object1,object2,object3,object4,object5,object6,object7,object8,object9,object10]; 
b = [[object3,object8,object5],[object2,object9,object1][object6,object7]]; 

//now, I can clone arraylist a 
aClone = [clone1,clone2,clone3,clone4,clone5,clone6,clone7,clone8,clone9,clone10]; 

//but how do I get a clone of arraylist b containing references to the clones of the objects like so: 
bClone = [[clone3,clone8,clone5],[clone2,clone9,clone1][clone6,clone7]]; 

何かが次のようです。私はこれが非常に遅いと思うので、どのようにこれをより効率的に行うことができるか知っていますか?

+0

あなたが話している参照の種類はわかりませんが、私が見ているものはすべてプリミティブ整数です。 –

+1

@MuratK。私の実際のコードでは、オブジェクトを使用しています。ここでは、わかりやすくするためにオブジェクトを表現するために数字を使用しています。 – Jonan

+0

ジョナン、何を試したのか、どんな問題に遭遇したのかを示す必要があることを知っています。 – alfasin

答えて

1

ただ、このようなクラスを作成します:

class CloneRepository { 
    private final Map<Object, Object> cloneMap = new HashMap<Object, Object>(); 

    public Object getClone(Object source) { 
     Object result = cloneMap.get(source); 

     if (result == null) { 
      result = source.clone(); 
      cloneMap.put(source, result); 
     } 

     return result; 
    } 
} 

は、次に(新しいCloneRepositoryを作成します)。各リストのエントリを複製するときは、オブジェクトを複製する代わりに、代わりにgetClone()メソッドを使用します。保持されているb上のリストのような myWrapper.cloneObject().

1

あなたはオブジェクトへの参照を指示していない、リストにラッパークラスを保持することによってこれを行うことができ、その後、次のようなメソッドを呼び出すことによってラップされたオブジェクトのクローンを作成することができますラッパークラスへの同じ参照は、オブジェクトが複製されるとき、2つのリストは同期されます。

0

に配列aを含めることができます。このオブジェクトの配列内の位置はハッシュマップです。次に、配列aをクローンするとき、このオブジェクトのインデックスを見つけ出す必要があります(HashMapはO(1)に対してそれを行います)。要約するとO(N)になります。

関連する問題