代碼

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); } }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章