本文共 2337 字,大约阅读时间需要 7 分钟。
BitSet
是一个在java.util
包下的工具类,在JDK 1.0
就已经存在了。但是比起位向量,我觉得BitSet
更加适合作为位图(BitMap
)索引。
前文提到过BitSet
可以用来做位图索引,下面我将用一个例子向大家展示怎么使用BitSet
。
假设存在以下业务场景,给两批人数相同的人分配序号,请实现以下功能:
/** * @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示例 * @author RJH * create at 2018/11/28 */public class BitSetDemo { /** * 随机生成数据 * @param num * @return */ public static ListgeneratePeople(int num){ List 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 people){ BitSet bitSet=new BitSet(); for(int i=0;i people1=generatePeople(10); List 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
转载地址:http://sroub.baihongyu.com/