Java中的位向量——BitSet

简介

BitSet是一个在java.util包下的工具类,在JDK 1.0就已经存在了。但是比起位向量,我觉得BitSet更加适合作为位图(BitMap)索引。

示例

前文提到过BitSet可以用来做位图索引,下面我将用一个例子向大家展示怎么使用BitSet

假设存在以下业务场景,给两批人数相同的人分配序号,请实现以下功能:

  1. 找出两批人中,男性和女性的人数
  2. 序号相同,且性别不同进行婚姻匹配

实体

/**
 * @author RJH
 * create at 2018/11/28
 */
public class Person {
    /**
     * 主键
     */
    private long id;

    /**
     * 性别,true为男性,false为女性
     */
    private boolean sex;
    
    ...省略getter/setter方法...
    
    @Override
    public String toString() {
        return "Person{" +
                "id=" + id +
                ", sex=" + (sex?"男":"女")+
                '}';
    }
}

使用BitSet

/**
 * BitSet示例
 * @author RJH
 * create at 2018/11/28
 */
public class BitSetDemo {

    /**
     * 随机生成数据
     * @param num
     * @return
     */
    public static List<Person> generatePeople(int num){
        List<Person> people=new ArrayList<>();
        Random random=new Random();
        for(int i=0;i<10;i++){
            Person p=new Person();
            if(random.nextInt(5)%2==0){
                p.setSex(true);
            }
            people.add(p);
        }
        return people;
    }

    /**
     * 生成位图索引
     * @param people
     * @return
     */
    public static BitSet getBitSet(List<Person> people){
        BitSet bitSet=new BitSet();
        for(int i=0;i<people.size();i++){
            if(people.get(i).isSex()){
                bitSet.set(i);
            }
        }
        return bitSet;
    }

    public static void main(String[] args) {
        List<Person> people1=generatePeople(10);
        List<Person> people2=generatePeople(10);
        System.out.println("第一批人:"+people1);
        System.out.println("第二批人:"+people2);
        BitSet bitSet1=getBitSet(people1);
        BitSet bitSet2=getBitSet(people2);
        System.out.println("第一批人中男性个数:"+bitSet1.cardinality()+",女性个数:"+(10-bitSet1.cardinality()));
        System.out.println("第二批人中男性个数:"+bitSet2.cardinality()+",女性个数:"+(10-bitSet2.cardinality()));
        //使用异或(xor)找出序号相同性别不同的人
        bitSet1.xor(bitSet2);
        System.out.println("婚配人数:"+bitSet1.cardinality());
    }
}

运行结果

第一批人:[Person{id=0, sex=女}, Person{id=0, sex=男}, Person{id=0, sex=女}, Person{id=0, sex=男}, Person{id=0, sex=男}, Person{id=0, sex=男}, Person{id=0, sex=男}, Person{id=0, sex=男}, Person{id=0, sex=男}, Person{id=0, sex=女}]
第二批人:[Person{id=0, sex=男}, Person{id=0, sex=男}, Person{id=0, sex=女}, Person{id=0, sex=男}, Person{id=0, sex=男}, Person{id=0, sex=男}, Person{id=0, sex=女}, Person{id=0, sex=男}, Person{id=0, sex=男}, Person{id=0, sex=男}]
第一批人中男性个数:7,女性个数:3
第二批人中男性个数:8,女性个数:2
婚配人数:3
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值