【问题标题】:Cloning multiple arraylists referencing the same objects克隆多个引用相同对象的数组列表
【发布时间】:2017-12-06 16:11:23
【问题描述】:

我有一个包含某些对象的数组列表a。我还有一个数组列表b,其中包含包含其中一些对象的数组列表。现在,我想克隆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 中是否存在旧对象,并将其替换为克隆。我想这会非常慢,所以有人知道如何更有效地完成吗?

【问题讨论】:

  • 不确定你在说什么类型的引用,但我看到的都是原始整数。
  • @MuratK。在我的实际代码中,我使用的是对象。在这里,为了清楚起见,我使用数字来表示对象
  • 乔南,您有足够的代表知道您还应该向我们展示您尝试了什么以及遇到了什么问题......

标签: java performance arraylist clone


【解决方案1】:

你可以通过在列表中保存包装类来做到这一点,而不是直接引用对象,然后你可以通过调用如下方法克隆被包装的对象: myWrapper.cloneObject().

由于b 上的列表持有对包装类的相同引用,因此在克隆对象时,这两个列表将同步。

【讨论】:

    【解决方案2】:

    只需创建一个这样的类:

    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() 方法。

    【讨论】:

      【解决方案3】:

      使用数组 a 你可以包含一个 hashmap - 这个对象在数组中的哪个位置。然后,当您克隆数组 a 时,您需要找到该对象的索引(HashMap 为 O(1) 执行此操作)并更改此引用。总结起来就是 O(N)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-06-27
        • 1970-01-01
        • 1970-01-01
        • 2011-01-19
        • 2019-03-25
        • 1970-01-01
        • 2013-01-29
        • 1970-01-01
        相关资源
        最近更新 更多