2016-11-18 12 views
2

JavaのBitSetクラスを使用してビットセットを処理しています。 2つのBitSetを比較するとき、私はサブセットという概念とという概念の間を明確に区別する必要があります。です。 Javaビットセット、サブセット対交差点

はのサブセットを取得するには、AND演算子での例を見てみましょう:私は確認するために、AND演算子を使用しているため

BitSet bits1 = new BitSet(); 
    BitSet bits2 = new BitSet(); 
    bits1.set(0,2,true); //110 
    bits2.set(1);  //010 
    //010 is a SUBSET of 110 
    bits1.and(bits2); //bits1 became the result of the and operator 
    if(bits1.equals(bits2)) 
    { 
     System.out.println(bits2 + " is a subset of " + bits1); 
    } 
    //PRINT 

    BitSet bits4 = new BitSet(); 
    bits4.set(0,2,true); //110 
    BitSet bits3 = new BitSet(); 
    bits3.set(1,3,true); //011 
    bits4.and(bits3); 
    //011 is NOT a subset of 110 
    if(bits4.equals(bits3)) 
    { 
     System.out.println(bits4 + " is a subset of " + bits3); 
    } 
    //NO PRINT 

サブセットはかなり明確であるのBitSetが別のサブセットです。

内蔵の交差事業者と同じ例:

BitSet bits1 = new BitSet(); 
    BitSet bits2 = new BitSet(); 
    bits1.set(0,2,true); //110 
    bits2.set(1);  //010 
    //010 intersect 110, but is also a subset of 110 
    System.out.println("Intersection? " + bits2.intersects(bits1)); 

    BitSet bits3 = new BitSet(); 
    bits3.set(1,3,true); //011 
    //011 VS 110 intersection only 
    System.out.println("Intersection? " + bits3.intersects(bits1)); 

は、ここに私の問題です:オペレータの交差点は、サブセットと交差の両方を検出します。 私の目標は、サブセットを除いた交差点だけを検出することです.2番目の例ではbits1とbits2のようにします。あまりにも一般的なので、この演算子は私のケースには適していません。 このプロパティを検出する方法はありますか?

答えて

2

bits1 bits2とbits1.and(bits2)の基数をとります。 and-cardinalityが0以外の場合、セットは交差します。ビット1の基数と同じ場合、bits1はbits2のサブセットであり、その逆もあります。

カーディナリティを使用すると、必要に応じてサブセットの関係をチェックすることができます(しかし、あなたの答えですでに言及したチェックよりはるかに速くは見えず、組み合わせることもできます)。