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);
    }
}

那么我应该在这里使用什么而不是 a Map<K1, Map<K2, V>>,或者如果没有更好的数据结构可用,那么访问和更改此类 Map 的值的更好方法是什么?

4

3 回答 3

2

您可以使用TableGoogle 的Guava来执行此操作,而无需担心实施。

检查番石榴页面:https ://code.google.com/p/guava-libraries/wiki/NewCollectionTypesExplained#Table

于 2013-05-08T13:23:17.630 回答
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 回答