2016-03-09 14 views
0

Можно ли сравнивать, если элементы одного цветкового фильтра присутствуют в другом фильтре цветения. Я знаю, что вы можете использовать .equals, но это не учитывает, например, если только некоторые из элементов присутствуют во втором фильтре цветка, что я и делаю.Сравнить guava bloom Фильтры?

Как-то сравнить установленные биты?

ответ

0

Google гуава не имеет встроенную поддержку для этого и не BloomFilter<T> выставлять свои отступающие биты, так что вы не можете получить доступ к тем, без использования отражения:

public static <T> boolean mightContainAll(BloomFilter<T> bloomFilter, BloomFilter<T> that) { 
    BitSet thisBitSet = getBitSet(bloomFilter); 
    BitSet thatBitSet = getBitSet(that); 
    BitSet intersectionBitSet = new BitSet(thisBitSet.size()); 
    intersectionBitSet.or(thisBitSet); 
    intersectionBitSet.and(thatBitSet); 
    return intersectionBitSet.equals(thatBitSet); 
} 

private static <T> BitSet getBitSet(BloomFilter<T> bloomFilter) { 
    try { 
     Field bitsField = BloomFilter.class.getDeclaredField("bits"); 
     bitsField.setAccessible(true); 
     Object bitArray = bitsField.get(bloomFilter); 
     Field dataField = bitArray.getClass().getDeclaredField("data"); 
     dataField.setAccessible(true); 
     return BitSet.valueOf((long[]) dataField.get(bitArray)); 
    } catch (NoSuchFieldException | IllegalAccessException e) { 
     throw new RuntimeException(e); 
    } 
}