我惊讶地发现,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;
}
答案 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然后在每个位上执行位操作来获得性能提升 - 但生成阵列的成本很可能会抵消其带来的好处。