快速制作哈希映射的副本

时间:2012-07-18 11:40:41

标签: java algorithm arraylist clone

  

可能重复:
  clone utility for HashMap in java

我有一对一的地图:

      HashMap<Integer, ArrayList<Double>> matrix;

整数是索引,而ArrayList的dimnesion大约为50.索引的大小可达一百万。我想尽快复制它(包括Arraylist值)。

我做了以下事情:

 public Map<Integer,ArrayList<Double>> getCloneOfMatrix(){
 Map<Integer, ArrayList<Double>> newMatrix = new HashMap<Integer,ArrayList<Double>>(); 
    for(int i=0 ; i < indexSize; i++){
        ArrayList<Double> arrList = new ArrayList<Double>();
        arrList=(ArrayList<Double>) matrix.get(i).clone();
        newMatrix.put(i,arrList);

    }           
    return   newMatrix;
}

我发现它计算成本很高,有没有办法以更快的方式完成它。

5 个答案:

答案 0 :(得分:4)

最快的方法是避免首先制作副本。

如果在写入方法上使用副本,则可以对同一结构进行两次引用,但不会看到其他更改。这样就无需复制所有内容,具体取决于您的使用情况,无需复制任何内容。

答案 1 :(得分:3)

您在每次迭代中都使用Map.get(),它会调用hashCode()函数,这可能是也可能不是微不足道的,然后在地图数据库中进行搜索。

您可以简单地对Map 中保存的Entry集进行迭代,这将大大减少消耗的总时间(假设{{1}相对较小)。

ArrayList

此外 - 您可能希望考虑使用库来处理数学矩阵。例如Colt提供了密集矩阵和两个稀疏矩阵的实现,它已经为您实现和测试。

答案 2 :(得分:0)

可能cloning via serialization会有所帮助。

答案 3 :(得分:0)

虽然它在复杂性方面没有帮助,但Java中的ArrayList<Double>需要装箱每个元素,而 - 因为它似乎是一个稀疏矩阵所以第二个维度是固定的 - 使用{{1}相反,它会降低每单位成本。

除了之外,使用经典的稀疏矩阵表示之一(假设它是稀疏的,或者你不会打扰哈希映射)。

答案 4 :(得分:0)

您应该尝试使用序列化/反序列化克隆作为this问题状态的答案。