java数据结构之Bitset

这是一种位集合,操作一组布尔值的时候可以通过(或or,与and,异或xor)等方法快速改变其组内某一部分值

BitSet bits1 = new BitSet(10);

BitSet bits2 = new BitSet(10);

for(int i=1;i<21;i++)
{
if(i%2==0)
{
bits1.set(i);
}
if(i%3==0)
{
bits2.set(i);
}
else
continue;

}

首先对两个BitSet变量赋值结果为

{2, 4, 6, 8, 10, 12, 14, 16, 18, 20}

{3, 6, 9, 12, 15, 18}

bits1.xor(bits2);

System.out.println("两集合异或:"+bits1);

两集合异或:{2, 3, 4, 8, 9, 10, 14, 15, 16, 20},调用的是bits1的方法,这是bits1目前的值,bits2仍为原数组

bits1.and(bits2);
System.out.println("两集合并:"+bits1);

结果:两集合并:{3, 9, 15}

注意:调用的一直是bits1内的方法,bits2的值一直保持为{3, 6, 9, 12, 15, 18}

bits1.cardinality( )此方法是判断集合内设置为true的个数

System.out.println("设置为true的位数:"+bits1.cardinality( ));

结果为(        设置为true的位数:3       )

重点:这里有一个重点需要先知道,BitSet集合所显示出来的数字都是被设置为true的,比如集合{-1,0,3,6}相当于其有{-1,0,1,2,3,4,5,6}这几个元素,分别对应{true,true,false,false,true,false,false,true}只有为true的地方才会被显示出来,所以集合的长度实际为7

bits1.clear(15);//参数为要删除的集合里的某个数值,(并非该位的值为15,可将其当作序号理解,第15位值有true变为false)

System.out.println("清除值为15后:"+bits1);

  清除值为15后:{3, 9}

//bits2.clear();//将集合里所有元素清除

//bits2.flip(3);//集合中无该参数,则添加入集合,有该参数则从集合中删除

bits2.flip(1,4);/*将【min,max)范围内有该元素的删除,无的加入;(相当于非)

//bits2.clear(1,3);//文档写其作用是清除下标【min,max)中的元素,不过测试了输出结果并没有出现该作用,这个问题待解决

bits1.equals(bits2);//判断两集合是否相等,是为true,不等为false

bits2.get(3); //判断集合内是否有该参数,返回值为boolean型,即判断第三位的值是否被设置为true,集合内是否出现

bits2.get(1,15));/*get(min,max)返回【min,max)内的一个新集合,集合为原集合在该范围内的元素分别减1,                                              如原集合{2,3,4},返回{1,2,3}*/  

bits2.hashCode();//返回哈希值

bits1.intersects(bits2));//判断两个集合是否有某元素相同,即有同一个位被设置为true

bits1.isEmpty();//集合是否为空,为空则true

bits1.length();//返回该集合最大值加1,如{2,6},最大为6,返回7

(这个length()方法可以结合上面提到的重点理解)

bits1.nextClearBit(9));/*返回从该参数开始的集合中,值为false的下一个元素,如集合{2,6},bits1.nextClearBit(1),则返回1,bits1.nextClearBit(6),则返回7*/

bits1.set('0');  //加入Ascll码,集合会将其显示为48

bits1.set(1,5);//将范围【1,5)设置为true

最后一个是bits1.clone()克隆方法,文档说是返回与之相同的一个集合

 BitSet b1 = new BitSet();

 b1 = bits1.clone();

会编译错误,此处求大神指教

建议用

BitSet b1 = new BitSet();

b1 = bits1; 代替clone()方法

 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值