我有一对一的地图:
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;
}
我发现它计算成本很高,有没有办法以更快的方式完成它。
答案 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问题状态的答案。