無限下標超大型bitset的java實現,超越原生int 20億下標的限制
阿新 • • 發佈:2018-12-13
* bitset超出int 20億範圍的處理方式 *設計思路:分段式bitset,即按照最大值進行分段,每個段都在int下標範圍內,舉個例子,有50億的id需要進行bitset標識,可以分為10段,每段5億,在int下標的範圍內 *java類實現: *方法1(初始化bitset):輸入:資料長度,每段長度 *方法2(查詢段bitset):輸入:下標 ,輸出:段bitset *方法3(計算偏移量):輸入:下標 ,輸出:偏移量 *方法4(繼承原java bitset所有方法):根據方法2、方法3可以呼叫原生所有bitset方法
package com.dudu.controller; import java.util.ArrayList; import java.util.BitSet; import java.util.List; /** * bitset超出int 20億範圍的處理方式 *設計思路:分段式bitset,即按照最大值進行分段,每個段都在int下標範圍內,舉個例子,有50億的id需要進行bitset標識,可以分為10段,每段5億,在int下標的範圍內 *java類實現: *方法1(初始化bitset):輸入:資料長度,每段長度 *方法2(查詢段bitset):輸入:下標 ,輸出:段bitset *方法3(計算偏移量):輸入:下標 ,輸出:偏移量 *方法4(繼承原java bitset所有方法):根據方法2、方法3可以呼叫原生所有bitset方法 * Created by 劉葉飛 on 2018/10/6. */ public class HugeBitset { //分段式bitset儲存在list中 private List<BitSet> bitsetList = new ArrayList(){}; // 下標最大值 private long max; // 每段值大小 private int seg; // 根據下標最大值,段大小初始化bitset HugeBitset(long max,int seg){ this.max = max; this.seg = seg; int segs = (int)(max/seg) +1; for(int i = 0;i<segs;i++){ BitSet temp = new BitSet(seg); bitsetList.add(temp); } System.out.println("HugeBitset#seg counts is:"+bitsetList.size()+", max is :"+max+", seg is :"+seg); } // 獲取段 bitset public BitSet getSegBitset(long index){ int segNo = (int)(index/seg); System.out.println("getSegBitset#segNo is:"+segNo+",index is :"+index); return bitsetList.get(segNo); } // 獲取段 bitset的偏移量 public int getBsOffset(long index){ int offset = (int)(index%seg); System.out.println("getBsOffset#offset is:"+offset+",index is :"+index); return offset; } public static void main(String[] args){ long testmax = 6748347838l; int testseg=500000000; long testindex1 = 38475643l; long testindex2 = 838888843l; long testindex3 = 4838888843l; long testindex4 = 6738888843l; HugeBitset testhb = new HugeBitset(testmax,testseg); testhb.getSegBitset(testindex1).set(testhb.getBsOffset(testindex1)); testhb.getSegBitset(testindex2).set(testhb.getBsOffset(testindex2)); testhb.getSegBitset(testindex3).set(testhb.getBsOffset(testindex3)); testhb.getSegBitset(testindex4).set(testhb.getBsOffset(testindex4)); System.out.println("GetResults:testindex1:"+testhb.getSegBitset(testindex1).get(testhb.getBsOffset(testindex1)) +" , testindex2:"+testhb.getSegBitset(testindex2).get(testhb.getBsOffset(testindex2)) +" , testindex3:"+testhb.getSegBitset(testindex3).get(testhb.getBsOffset(testindex3)) +" , testindex4:"+testhb.getSegBitset(testindex4).get(testhb.getBsOffset(testindex4)) ); // System.out.println((int)(testmax%testseg)); // System.out.println((int)5l/2); } }