2012-12-27 38 views
0

BitSet的set()函数被设置(int param)。我试图通过发送一个long类型来实现Bitset函数。那里有API或者教程吗?谢谢。实现参数很长的Bitset函数

BitSet mobiphoneUsers = new BitSet(); 

bitset.set(12311111111111111111L); 

if(bitset.get(1231111111111111111L)) { 
    System.out.println("1231111111111111L is mobiphone user"); 
} 
+0

你是什么意思'实现'位集功能? – Michael

+0

这可能不是你想要的,因为'BitSet'的'set()'方法会将给定偏移量的位设置为值1(并且它的参数是一个'int',所以你的'123L'会变成downcast到'int'。小心解释一下你想做什么? – fge

+0

BitSet API是开源的,它不包含像set(long)这样的方法,所以你想做什么? – Juvanis

回答

4

如果您正在使用超过2个十亿比特创建BitSet,我猜,只有那些项目的一小部分被设置。对于像这样设置的“稀疏”位,最好使用HashSet<Long>

HashSet<Long> bitset = new HashSet<Long>(); 

bitset.add(12311111111111111111L); 

if(bitset.contains(1231111111111111111L)) { 
    System.out.println("1231111111111111L is mobiphone user"); 
} 
+0

由于Bitset节省空间,我使用它。如果t他参数类型很长,哪种方式更好? HashSet或自定义Bitset? @Russell Zahniser – Felix

+0

@Felix:如果您有一个大小为2,000,000,000的“BitSet”中设置了1000位,则使用250,000,000字节。具有相同值的'HashSet'可能会使用大约16,000字节。基本上,如果小于5%的可能值被设置,那么你有一个“稀疏”设置,并且散列实现将会更高效地存储内存。 –

+1

@Felix:节省空间?你看到一个'BitSet'在哪里可以节省空间?对于其中的大多数,“BitSet”对象本身的开销超过其工作内容。除非你真的需要:不要担心Java中的“节省空间”:更多的时候,它会比你自己做的更好。 – fge