再看不懂BitMap算法,我请你吃饭(二)

java.util.BitSet

其实,Java API中有类似的BitMap实现。为了方便理解,假设要完成如下的算法:

  • 将[0, M]之间的整数集合记为A
  • 在[0, M)范围内,随机生成X个整数,其集合记为B
  • 计算:A - B
  • 举例:在[0, 10)之间,随机生成了0, 9, 3这三个数,计算结果,即A - B等于1, 2, 4, 5, 6, 7, 8, 10
import org.junit.Test;

import java.util.BitSet;
import java.util.Random;

public class BitSetTest {
    public static final int X = 3;
    public static final int M = 10;

    @Test
    public void test() {
        BitSet bitSet = new BitSet(M + 1);

        Random random = new Random();
        for (int i = 0; i < X; i++) {
            int randomInt = random.nextInt(M);
            System.out.println("### 随机生成:" + randomInt);
            bitSet.set(randomInt);
        }

        System.out.println("### 打印BitSet:");
        print(bitSet.toByteArray());

        System.out.println("### A - B:");
        for (int i = 0; i < M + 1; i++) {
            if (!bitSet.get(i)) {
                System.out.println(i);
            }
        }
    }

    private void print(byte[] byteArr) {
        for (byte b : byteArr) {
            System.out.print(getBit(b));
            System.out.println();
        }
    }

    private static String getBit(byte by){
        StringBuffer sb = new StringBuffer();
        sb.append((by>>7)&0x1)
                .append((by>>6)&0x1)
                .append((by>>5)&0x1)
                .append((by>>4)&0x1)
                .append((by>>3)&0x1)
                .append((by>>2)&0x1)
                .append((by>>1)&0x1)
                .append((by>>0)&0x1);
        return sb.toString();
    }
}

运行结果如下:

### 随机生成:8
### 随机生成:6
### 随机生成:4
### 打印BitSet:
01010000
00000001
### A - B:
0
1
2
3
5
7
9
10

对于下面两行是不是很熟悉啊(不熟悉的参见上篇博客):有两排小正方形,第0排,从右向左数,序号是4、6的,其灯是亮的。第1排,从右向左数,序号是8的,其灯是亮的。

01010000
00000001
java.util.BitSet VS 自定义的BitMapV1
java.util.BitSet自定义的BitMapV1
BitSet.set(…)BitMapV1.add(…)
BitSet.get(…)BitMapV1.isExist(…)
BitSet.clear(…)BitMapV1.clear(…)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值