3

重複の可能性:
Java の HashMap のクローン ユーティリティ

次のような1対1のマップがあります。

      HashMap<Integer, ArrayList<Double>> matrix;

整数はインデックスで、ArrayList の次元は約 50 です。インデックスのサイズは最大 100 万です。早急にコピー(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;
}

計算コストが高いことがわかりました。より高速に実行する方法はありますか。

4

5 に答える 5

4

これを行う最も速い方法は、最初からコピーを作成する必要がないようにすることです。

コピー オン ライト アプローチを使用する場合、同じ構造への 2 つの参照を持つことができますが、他の変更は表示されません。これにより、すべてをコピーする必要がなくなり、使用状況によっては、何かをコピーする必要がなくなります。

于 2012-07-18T11:48:24.897 に答える
3

あなたはMap.get()すべての反復で使用しています。それは、hashCode()自明かもしれないしそうでないかもしれない関数を順番に呼び出し、次に地図データベースで検索します。

Entryに保持されているセットを反復するだけで、MapArrayList消費される合計時間が大幅に短縮されます (が比較的小さいという事実を考えると)。

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

また、数学行列を処理するためのライブラリの使用を検討することもできます。たとえば、 Coltは密行列と疎行列の両方の実装を提供しており、既に実装およびテストされています。

于 2012-07-18T11:50:12.563 に答える
0

この質問の回答にあるように、シリアライゼーション/デシリアライゼーションを使用してクローン作成を試す必要があります。

于 2012-07-18T11:49:39.327 に答える
0

シリアライゼーションによるクローン作成が役立つ可能性があります。

于 2012-07-18T11:47:43.017 に答える
0

複雑さの点では役に立ちませんがArrayList<Double>、Java ではすべての要素をボックス化する必要がありますが、疎行列のように見えるため、2 番目の次元が固定されているため、double[]代わりに使用するとユニットあたりのコストが低くなります。

それ以外は、古典的な疎行列表現の 1 つを使用します (それが疎であるか、ハッシュ マップを気にしないと仮定します)。

于 2012-07-18T11:48:20.997 に答える