Java中的Bitset类
2015-08-10 14:26
585 查看
位集合类实现了一组可以单独设置和清除的位或标志。
该类在处理一组布尔值的时候非常有用,是一组大小可动态改变, 取值为true或false的位集合,用于表示一组布尔标志,你只需要给每个值赋值一"位"。然后对位进行适当的设置或清除,就可以对布尔值进行操作了。
此类实现了一个按需增长的位向量。位 set 的每个组件都有一个 boolean 值。用非负的整数将 BitSet 的位编入索引。可以对每个编入索引的位进行测试、设置或者清除。通过逻辑与、逻辑或和逻辑异或操作,可以使用一个 BitSet 修改另一个 BitSet 的内容。
默认情况下,set 中所有位的初始值都是 false。
每个位 set 都有一个当前大小,也就是该位 set 当前所用空间的位数。注意,这个大小与位 set 的实现有关,所以它可能随实现的不同而更改。位 set 的长度与位 set 的逻辑长度有关,并且是与实现无关而定义的。
除非另行说明,否则将 null 参数传递给 BitSet 中的任何方法都将导致 NullPointerException。
在没有外部同步的情况下,多个线程操作一个 BitSet
是不安全的。
下面是该类的详细使用信息:
构造方法一:
创建一个默认的对象:Bitset()
构造方法二:
创建一个指定初始大小的对象,所有位初始化为0,0代表:false,1代表:true=>Bitset(int size)
所有方法:
请自己参看API
实例1:Bitset里面一些方法的简单使用
import java.util.BitSet;
public class BitSetDemo {
public static void main(String args[]) {
BitSet bits1 = new BitSet(16);
BitSet bits2 = new BitSet(16);
// set some bits
for(int i=0; i<16; i++) {
if((i%2) == 0) bits1.set(i);
if((i%5) != 0) bits2.set(i);
}
System.out.println("Initial pattern in bits1: ");
System.out.println(bits1);
System.out.println("\nInitial pattern in bits2: ");
System.out.println(bits2);
// AND bits
bits2.and(bits1);
System.out.println("\nbits2 AND bits1: ");
System.out.println(bits2);
// OR bits
bits2.or(bits1);
System.out.println("\nbits2 OR bits1: ");
System.out.println(bits2);
// XOR bits
bits2.xor(bits1);
System.out.println("\nbits2 XOR bits1: ");
System.out.println(bits2);
System.out.println("\nbits1的总长度: " + bits1.size());
for (int i = 0;i<bits1.size();i++) {
System.out.println(bits1.get(i));
}
System.out.println("\nbits2的总长度: " + bits2.size());
bits2.set('a');
bits2.set('b');
for (int i = 0;i<bits2.size();i++) {
System.out.println(bits2.get(i));
}
System.out.println(bits2);
}
}
输出结果:
Initial pattern in bits1:
{0, 2, 4, 6, 8, 10, 12, 14}
Initial pattern in bits2:
{1, 2, 3, 4, 6, 7, 8, 9, 11, 12, 13, 14}
bits2 AND bits1:
{2, 4, 6, 8, 12, 14}
bits2 OR bits1:
{0, 2, 4, 6, 8, 10, 12, 14}
bits2 XOR bits1:
{}
bits1的总长度: 64-------------------------为什么长度是64?=》说明默认的构造函数声明一个64位的BitSet,值都是false。如果你要用的位超过了默认size,它会再申请64位,而不是报错。
true
false
true
false
true
false
true
false
true
false
true
false
true
false
true
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
bits2的总长度: 64
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
true
true
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
{97, 98}
实例2:标明一个字符串中用了哪些字符
运行:
C:\work>java WhichChars
[ Hdouwy]
实例3:在BitSet中存值~取值:
import java.util.BitSet;
public class MainTestFive {
//找出数据集合最大值
public static int getMaxValue(int[] zu){
int temp=0;
temp=zu[0];
for(int i=0;i<zu.length;i++){
if(temp<zu[i]){
temp=zu[i];
}
}
System.out.println("maxvalue:"+temp);
return temp;
}
//放值
public static void putValueIntoBitSet(int[] shu,BitSet bs){
for(int i=0;i<shu.length;i++){
bs.set(shu[i], true);
}
}
/**
* @param args
*/
public static void main(String[] args) {
int[] shu={2,42,5,6,6,18,33,15,25,31,28,37};
BitSet bm1=new BitSet(MainTestFive.getMaxValue(shu));
System.out.println("bm1.size()--"+bm1.size());
MainTestFive.putValueIntoBitSet(shu, bm1);
printBitSet(bm1);
}
//初始全部为false,这个你可以不用,因为默认都是false
public static void initBitSet(BitSet bs){
for(int i=0;i<bs.size();i++){
bs.set(i, false);
}
}
//打印
public static void printBitSet(BitSet bs){
StringBuffer buf=new StringBuffer();
buf.append("[\n");
for(int i=0;i<bs.size();i++){
if(i<bs.size()-1){
buf.append(MainTestFive.getBitTo10(bs.get(i))+",");
}else{
buf.append(MainTestFive.getBitTo10(bs.get(i)));
}
if((i+1)%8==0&&i!=0){
buf.append("\n");
}
}
buf.append("]");
System.out.println(buf.toString());
}
//true,false换成1,0为了好看
public static String getBitTo10(boolean flag){
String a="";
if(flag==true){
return "1";
}else{
return "0";
}
}
}
注意:对重复的数字过滤,就是说,一个数字出现过超过2次的它都记成1
该类在处理一组布尔值的时候非常有用,是一组大小可动态改变, 取值为true或false的位集合,用于表示一组布尔标志,你只需要给每个值赋值一"位"。然后对位进行适当的设置或清除,就可以对布尔值进行操作了。
此类实现了一个按需增长的位向量。位 set 的每个组件都有一个 boolean 值。用非负的整数将 BitSet 的位编入索引。可以对每个编入索引的位进行测试、设置或者清除。通过逻辑与、逻辑或和逻辑异或操作,可以使用一个 BitSet 修改另一个 BitSet 的内容。
默认情况下,set 中所有位的初始值都是 false。
每个位 set 都有一个当前大小,也就是该位 set 当前所用空间的位数。注意,这个大小与位 set 的实现有关,所以它可能随实现的不同而更改。位 set 的长度与位 set 的逻辑长度有关,并且是与实现无关而定义的。
除非另行说明,否则将 null 参数传递给 BitSet 中的任何方法都将导致 NullPointerException。
在没有外部同步的情况下,多个线程操作一个 BitSet
是不安全的。
下面是该类的详细使用信息:
构造方法一:
创建一个默认的对象:Bitset()
构造方法二:
创建一个指定初始大小的对象,所有位初始化为0,0代表:false,1代表:true=>Bitset(int size)
所有方法:
请自己参看API
实例1:Bitset里面一些方法的简单使用
import java.util.BitSet;
public class BitSetDemo {
public static void main(String args[]) {
BitSet bits1 = new BitSet(16);
BitSet bits2 = new BitSet(16);
// set some bits
for(int i=0; i<16; i++) {
if((i%2) == 0) bits1.set(i);
if((i%5) != 0) bits2.set(i);
}
System.out.println("Initial pattern in bits1: ");
System.out.println(bits1);
System.out.println("\nInitial pattern in bits2: ");
System.out.println(bits2);
// AND bits
bits2.and(bits1);
System.out.println("\nbits2 AND bits1: ");
System.out.println(bits2);
// OR bits
bits2.or(bits1);
System.out.println("\nbits2 OR bits1: ");
System.out.println(bits2);
// XOR bits
bits2.xor(bits1);
System.out.println("\nbits2 XOR bits1: ");
System.out.println(bits2);
System.out.println("\nbits1的总长度: " + bits1.size());
for (int i = 0;i<bits1.size();i++) {
System.out.println(bits1.get(i));
}
System.out.println("\nbits2的总长度: " + bits2.size());
bits2.set('a');
bits2.set('b');
for (int i = 0;i<bits2.size();i++) {
System.out.println(bits2.get(i));
}
System.out.println(bits2);
}
}
输出结果:
Initial pattern in bits1:
{0, 2, 4, 6, 8, 10, 12, 14}
Initial pattern in bits2:
{1, 2, 3, 4, 6, 7, 8, 9, 11, 12, 13, 14}
bits2 AND bits1:
{2, 4, 6, 8, 12, 14}
bits2 OR bits1:
{0, 2, 4, 6, 8, 10, 12, 14}
bits2 XOR bits1:
{}
bits1的总长度: 64-------------------------为什么长度是64?=》说明默认的构造函数声明一个64位的BitSet,值都是false。如果你要用的位超过了默认size,它会再申请64位,而不是报错。
true
false
true
false
true
false
true
false
true
false
true
false
true
false
true
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
bits2的总长度: 64
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
true
true
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
{97, 98}
实例2:标明一个字符串中用了哪些字符
import java.util.BitSet; public class WhichChars{ private BitSet used = new BitSet(); public WhichChars(String str){ for(int i=0;i< str.length();i++) used.set(str.charAt(i)); // set bit for char } public String toString(){ String desc="["; int size=used.size(); for(int i=0;i< size;i++){ if(used.get(i)) desc+=(char)i; } return desc+"]"; } public static void main(String args[]){ WhichChars w=new WhichChars("How do you do"); System.out.println(w); } }
运行:
C:\work>java WhichChars
[ Hdouwy]
实例3:在BitSet中存值~取值:
import java.util.BitSet;
public class MainTestFive {
//找出数据集合最大值
public static int getMaxValue(int[] zu){
int temp=0;
temp=zu[0];
for(int i=0;i<zu.length;i++){
if(temp<zu[i]){
temp=zu[i];
}
}
System.out.println("maxvalue:"+temp);
return temp;
}
//放值
public static void putValueIntoBitSet(int[] shu,BitSet bs){
for(int i=0;i<shu.length;i++){
bs.set(shu[i], true);
}
}
/**
* @param args
*/
public static void main(String[] args) {
int[] shu={2,42,5,6,6,18,33,15,25,31,28,37};
BitSet bm1=new BitSet(MainTestFive.getMaxValue(shu));
System.out.println("bm1.size()--"+bm1.size());
MainTestFive.putValueIntoBitSet(shu, bm1);
printBitSet(bm1);
}
//初始全部为false,这个你可以不用,因为默认都是false
public static void initBitSet(BitSet bs){
for(int i=0;i<bs.size();i++){
bs.set(i, false);
}
}
//打印
public static void printBitSet(BitSet bs){
StringBuffer buf=new StringBuffer();
buf.append("[\n");
for(int i=0;i<bs.size();i++){
if(i<bs.size()-1){
buf.append(MainTestFive.getBitTo10(bs.get(i))+",");
}else{
buf.append(MainTestFive.getBitTo10(bs.get(i)));
}
if((i+1)%8==0&&i!=0){
buf.append("\n");
}
}
buf.append("]");
System.out.println(buf.toString());
}
//true,false换成1,0为了好看
public static String getBitTo10(boolean flag){
String a="";
if(flag==true){
return "1";
}else{
return "0";
}
}
}
注意:对重复的数字过滤,就是说,一个数字出现过超过2次的它都记成1
相关文章推荐
- Java的TreeMap统计单词数量
- java获取获得Timestamp类型的当前系统时间
- myeclipse配置内存
- Java解析xml的主要解析器: SAX和DOM的选择(附上新方法--Pull解析)
- 连续正整数集合子集的java算法
- 如何在 Java 中正确使用 wait, notify 和 notifyAll – 以生产者消费者模型为例
- springmvc 常见问题
- java中使用sax解析xml的解决方法
- Java ActiveMQ 讲解(二)Spring ActiveMQ整合+注解消息监听
- springmvc配置
- java序列化与反序列化的区别
- Eclipse实用快捷键大全
- java容器类---LinkedHashMap、LinkedHashSet
- java的递归实现原理
- Java调用系统默认程序打开本地文件
- 【Java设计模式】· 调停者模式(Mediator Pattern)
- eclipse 插件relo使用
- 向eclipse中导入myeclipse项目
- eclipse下使用动态库、静态库相应的配置
- 使用Android design support library在Eclipse和Android Studio