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(…) |