无限下标超大型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);

    }
}

打个养成读书习惯的广告,扫二维码可以免费领取月卡:

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值