2014-02-21 42 views
1

我剛剛發現我的意外,那java.util.BitSet沒有containsAll的方法。我需要的,是類似如下:BitSet,no 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

爲什麼不只是做右移,按位AND,最後檢查結果是否爲1 – noMAD

回答

5

你的方法很好。如果您更喜歡使用更多的內置BitSet方法,則可以克隆第一個位集,並與第二個位進行邏輯AND,然後檢查是否與第二個位相等。

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

For contains所有您正在查看一個bitset中的每個元素是否在另一箇中。

循環肯定會這樣做。如果你有權訪問底層的數據結構,你可以使用按位操作,但不幸的是你沒有。

您可以通過對兩個bitset執行longArray操作,然後在每個long操作上進行位操作來獲得性能增益 - 但生成陣列的成本很可能會抵消好處。