我有一个包含某些对象的arraylist a
。我还有一个arraylist b
包含包含其中一些对象的arraylists。现在,我想克隆arraylist a
,同时将arraylist b
中的引用更新为克隆对象。伪代码示例:
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]];
我想出的是以下内容:
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);
}
}
}
如果b
中存在旧对象,则此代码在创建每个克隆后进行检查,并将其替换为克隆。我想这会非常缓慢,所以有谁知道如何更有效地完成这项工作?
答案 0 :(得分: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()方法。
答案 1 :(得分:1)
您可以通过在列表中保存包装类来完成此操作,而不是直接引用对象,然后您可以通过调用以下方法来克隆包装对象:
myWrapper.cloneObject().
由于b
上的列表对包装类具有相同的引用,因此在克隆对象时,将同步2个列表。
答案 2 :(得分:0)
使用数组a,您可以包含一个hashmap - 该对象在数组中的哪个位置。然后当你克隆你的数组a时,你需要找到这个对象的索引(HashMap为O(1)做它)并更改这个引用。它总结为O(N)。