【问题标题】:Fast making copy of an hash map [duplicate]快速复制哈希图[重复]
【发布时间】:2012-07-17 10:29:08
【问题描述】:

可能重复:
clone utility for HashMap in java

我有一张一对一的地图:

      HashMap<Integer, ArrayList<Double>> matrix;

Integer 是索引,ArrayList 的维度约为 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;
}

我发现它的计算成本很高,有什么方法可以更快地做到这一点。

【问题讨论】:

  • 可能不超过几个 %,但是在分配另一个引用之前立即分配给 arrListnew ArrayList&lt;Double&gt;(); 完全没有意义。
  • 奇怪的是地图的作用类似于列表...当您使用 for [0..indexSize] 迭代地图时,您不能使用列表来代替吗?
  • 我不明白你的意思。能详细点吗?
  • 有一些用于稀疏矩阵的内置库(Colt 就是一个例子),我相信使用这些库可能会为您节省一些实施时间
  • 对这样一张巨大的地图进行深度复制总是会耗费大量计算资源。如果您期望有这么多数据,我不确定 Map 是否是正确的方法。

标签: java algorithm arraylist clone


【解决方案1】:

最快的方法是避免一开始就制作副本。

如果您使用写时复制方法,您可以有两个对同一结构的引用,但都不会看到其他的更改。这避免了复制所有内容的需要,并且根据您的使用情况,避免了复制任何内容的需要。

【讨论】:

  • 这是一个有见地的答案,但如果解释了如何实现写时复制,可能会更有帮助
【解决方案2】:

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

你可以简单地迭代Map中的Entry集合,这将大大减少消耗的总时间(考虑到ArrayList相对较小) .

for(Entry<Integer,ArrayList<Double> entry : matrix.entrySet()) {
        //get the key using entry.getKey()
        //get the value (the ArrayList) using entry.getValue()
}     

另外 - 您可能想要考虑使用库来处理数学矩阵。例如Colt 提供了密集矩阵和稀疏矩阵的实现,并且已经为您实现和测试。

【讨论】:

  • Integer.hashCode 是微不足道的,但你仍然可以直接节省一些迭代
  • @PeteKirkham:hashCode() 评论更多的是一般情况,在这里它确实是微不足道的,但地图查找不是。
【解决方案3】:

cloning via serialization 可能会有所帮助。

【讨论】:

    【解决方案4】:

    虽然它在复杂性方面无济于事,但 Java 中的 ArrayList&lt;Double&gt; 需要对每个元素进行装箱,而 - 因为它似乎是一个稀疏矩阵,所以第二维是固定的 - 使用 double[] 代替会给出单位成本更低。

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

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-01-04
        • 2014-02-01
        • 1970-01-01
        • 2012-12-27
        • 2011-07-16
        • 2013-03-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多