0

私は、レコメンダー システム用の WeightedSlopeOne 予測アルゴリズムを実装しています。コードのある時点で、2 つの 2D マップが必要ですMap<Integer, Map<Integer, Integer>>Map<Integer, Map<Integer, Double>>

これらにアクセスして値を割り当てるのは面倒な手順です。

//The following 20 lines are 1 line in Python. Sigh...
HashMap<Integer, Integer> freqsForItem1 = frequencies.get(curItemID);
//See if we have a value for curItemID
if (freqsForItem1 == null) {
    freqsForItem1 = new HashMap<Integer, Integer>();
    freqsForItem1.put(curItemID_2, 1);
    frequencies.put(curItemID, freqsForItem1);
}
else {//See if we have a value for curItemID+curItemID_2
    Integer freqForItem1Item2 = freqsForItem1.get(curItemID_2);
    if (freqForItem1Item2 == null) {
        //If we don't have a value for item1+item2 we just put 1
        freqsForItem1.put(curItemID_2, 1);
    }
    else {//We already have a value for curItemID+curItemID_2
        //So we just increment it
        freqsForItem1.put(curItemID_2, freqForItem1Item2 + 1);
    }
}

では、ここで の代わりに何を使用する必要がMap<K1, Map<K2, V>>ありますか、またはより良いデータ構造が利用できない場合、そのような Map の値にアクセスして変更するより良い方法は何ですか?

4

3 に答える 3

2

マップのマップを使用する代わりに、2 つの整数キーを格納する新しい不変クラス (適切に実装されたメソッドequals()hashCode()メソッドを使用)を作成し、それをより単純なマップのキーとして使用できます。

class MyKey {
    int first;
    int second;
    // etc...
}

Map<MyKey, Integer> freqs = new HashMap<MyKey, Integer();

これにより、値へのアクセスと割り当てが大幅に簡素化され、キーをより複雑にする必要があると判断した場合はさらに簡単になります。

于 2013-05-08T13:23:48.310 に答える
-1

したがって、キーは両方の次元で整数です。なぜあなたは使用しないのですか

HashMap<Integer, Double> [] 

代わりは?または少なくとも

ArrayList<HashMap<Integer, Double>>

はるかにパフォーマンスが向上します

于 2013-05-08T13:26:02.853 に答える