1. 程式人生 > >無限下標超大型bitset的java實現,超越原生int 20億下標的限制

無限下標超大型bitset的java實現,超越原生int 20億下標的限制

* 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);

    }
}