BitSet,没有containsAll,最好的解决方法?

时间:2014-02-21 23:38:40

标签: java bitset

我惊讶地发现,java.util.BitSet没有containsAll方法。我需要的是以下内容:

BitSet s1 = newBitSet(1, 2, 3, 4, 6);
BitSet s2 = newBitSet(1, 2, 3, 4);
BitSet s3 = newBitSet(1, 2, 3, 4, 5);
assertTrue(containsAll(s1, s2));
assertFalse(containsAll(s1, s3));

private static BitSet newBitSet(int... values) {
    BitSet bitSet = new BitSet();
    for (int value : values) {
        bitSet.set(value);
    }
    return bitSet;
}

实施containsAll方法的最佳变体是什么?有没有比这样迭代更优雅的方式? (从JavaDoc获取的迭代代码)

private static boolean containsAll(BitSet s1, BitSet s2) {
    for (int i = s2.nextSetBit(0); i >= 0; i = s2.nextSetBit(i + 1)) {
        if (!s1.get(i)) {
            return false;
        }
    }
    return true;
}

2 个答案:

答案 0 :(得分:6)

你的方法很好。如果您更喜欢使用更多内置BitSet方法,则可以克隆第一个位集并使用第二个位进行逻辑AND,然后检查与第二个位置的相等性。

private static boolean containsAll(BitSet s1, BitSet s2) {
    BitSet intersection = (BitSet) s1.clone();
    intersection.and(b2);
    return intersection.equals(s2)
}

答案 1 :(得分:1)

对于containsAll,您要查看一个bitset中的每个元素是否在另一个中。

循环肯定能够做到这一点。如果您可以访问基础数据结构,则可以使用按位运算,但遗憾的是您没有。

您可以通过对两个位集执行longArray然后在每个位上执行位操作来获得性能提升 - 但生成阵列的成本很可能会抵消其带来的好处。