import lombok.Data;
import lombok.ToString;
import org.roaringbitmap.RoaringBitmap;
import java.util.*;
public class RangeBitmapDemo {
private static Map<Character,TagVal> tagMap = new TreeMap<>();
private static Map<String,RoaringBitmap> tagBitmap = new HashMap<>();
private static int maxLength = 0;
@Data
private static class TagVal{
private Character tagKey;
private Integer tagVal;
private Integer keyId;
private String binary;
public TagVal(char tagKey, int tagVal){
this.tagKey = tagKey;
this.keyId = tagKey-'a' +1;
this.tagVal = tagVal;
this.binary = Integer.toBinaryString(tagVal);
}
public void setBinary(int length){
String val = String.format("%"+length+"s", binary); //這裏可以補空格
this.binary = val.replaceAll(" ", "0"); //把空格換成0
}
@Override
public String toString(){
return String.format("%s:%3d\t%c:%d",binary,tagVal,tagKey,keyId);
}
}
public static void initData(){
for(int i=0;i<20;i++){
int val = (int) (100*Math.random())%20;
tagMap.put((char) ('a'+i),new TagVal((char) ('a'+i), val));
maxLength=Math.max(maxLength,Integer.toBinaryString(val).length());
}
for(Map.Entry<Character,TagVal> entry:tagMap.entrySet()){
entry.getValue().setBinary(maxLength);
System.out.println(entry.getValue());
}
}
public static void initBitmap(){
tagBitmap.put("b0" ,new RoaringBitmap());
for(int i=1;i<=maxLength;i++){
RoaringBitmap b = new RoaringBitmap();
tagBitmap.put("b"+i ,b);
}
for(TagVal tagVal:tagMap.values()){
tagBitmap.get("b0").add(tagVal.keyId);
for(int i=1;i<=maxLength;i++){
if(tagVal.binary.charAt(i-1)=='0'){
tagBitmap.get("b"+i).add(tagVal.keyId);
}
}
}
printTagKeys();
}
public static void printTagKeys(){
for(Map.Entry<String,RoaringBitmap> entry:tagBitmap.entrySet()){
List<Character> list = new ArrayList();
for (int i:entry.getValue()) {
list.add((char) ('a'+i-1));
}
System.out.println(entry.getKey()+":"+list);
}
}
public static void query(int upper){
String val =String.format("%"+maxLength+"s", Integer.toBinaryString(upper)).replaceAll(" ","0"); //這裏可以補空格
System.out.println("query: upper is "+val);
}
public static void main(String[] args) {
initData();
initBitmap();
query(10);
}
}
代碼
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.