包含整数的集合在java或groovy

时间:2016-03-15 07:34:50

标签: java groovy comparison similarity

我有HashSet<Integer> AB我要进行比较,以获得一个数值,它们的相似程度如何(例如0.9 A和{{1 }} 是相同的)。在java或groovy中执行此操作的最佳(最快)方法是什么?

我这样做的天真方法是从BA获取所有相等的元素,并将它们的大小除以B的原始大小。有什么理由(例如速度)为什么这不能正常工作?一般来说,我更喜欢任何已经实现的方式来获得相似性。

注意:将A1, 2进行比较应为0%相似度。

2 个答案:

答案 0 :(得分:3)

计算大小为M和N的2个任意HashSets的相似性的唯一方法是选择最小的HashSets并检查其元素是否存在于较大的一个中。 JDK中没有这样的方法。如果您正在寻找最快的解决方案,请编写自己的解决方案:

int count = 0;
for (E element : smallSet) {
    if (bigSet.contains(element) {
       count++;
    }
}

如果您不太关心性能和额外内存,可以使用

int count = new HashSet(smallSet).retainAll(bigSet);
来自Guava

或类似方法Sets#intersection(Set, Set)

答案 1 :(得分:1)

就像亚当建议的那样,循环是找到交叉点大小的最有效方法

public static int intersectionsCount(Set set1, Set set2) {
    if (set2.size() < set1.size()) return intersectionsCount(set2, set1);
    int count = 0;
    for (Object o : set1)
        if (set2.contains(o)) count++;
    return count;
}

public static double commonRatio(Set set1, Set set2) {
    int common = intersectionsCount(set1, set2);
    int union = set1.size() + set2.size() - common;
    return (double) common / union; // [0.0, 1.0]
}