RoaringBitmap的使用方法
发表于:2025-12-01 作者:千家信息网编辑
千家信息网最后更新 2025年12月01日,这篇文章主要介绍"RoaringBitmap的使用方法",在日常操作中,相信很多人在RoaringBitmap的使用方法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"R
千家信息网最后更新 2025年12月01日RoaringBitmap的使用方法
这篇文章主要介绍"RoaringBitmap的使用方法",在日常操作中,相信很多人在RoaringBitmap的使用方法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"RoaringBitmap的使用方法"的疑惑有所帮助!接下来,请跟着小编一起来学习吧!
1、简单Demo
参考: RoaringBitmap
public class Demo { @Test public void test1(){ // 向r1中添加1、2、3、1000四个数字 RoaringBitmap r1 = RoaringBitmap.bitmapOf(1, 2, 3, 1000); // 返回第3个数字是1000 System.out.println(r1.select(3)); r1.add(5); // 返回10000的索引,是4 System.out.println(r1.rank(1000)); System.out.println(r1.rank(3)); System.out.println(r1.rank(2)); System.out.println(r1.rank(1)); // 是否包含1000和7,true和false System.out.println(r1.contains(1000)); System.out.println(r1.contains(7)); RoaringBitmap r2 = new RoaringBitmap(); // 向r2添加10000-12000共2000个数字 r2.add(10000L, 12000L); // 将两个r1,r2进行合并,数值进行合并,合并产生新的RoaringBitmap RoaringBitmap r3 = RoaringBitmap.or(r1, r2); // r1和r2进行位运算,并将结果赋值给r1 r1.or(r2); // 判断r1与r3是否相等,true System.out.println(r1.equals(r3)); // 查看r1中存储了多少个值,2004 System.out.println(r1.getLongCardinality()); // 两种遍历方式 for(int i : r1){ System.out.println(i); } r1.forEach((Consumer super Integer>) i -> System.out.println(i.intValue())); } @Test public void test2(){ RoaringBitmap roaringBitmap = new RoaringBitmap(); roaringBitmap.add(1L, 10L); // 遍历输出 roaringBitmap.forEach((IntConsumer)i -> System.out.println(i)); // 遍历放入List中 List numbers = new ArrayList<>(); roaringBitmap.forEach((IntConsumer) numbers::add); System.out.println(numbers); roaringBitmap.runOptimize(); int size = roaringBitmap.serializedSizeInBytes(); ByteBuffer buffer = ByteBuffer.allocate(size); roaringBitmap.serialize(buffer); // 将RoaringBitmap的数据转成字节数组,这样就可以直接存入数据库了,数据库字段类型BLOB byte[] bitmapData = buffer.array(); }} // List变成RoaringBitmapprivate RoaringBitmap buildBitmap(ListidList) { RoaringBitmap roaringBitmap = new RoaringBitmap(); idList.forEach(id -> roaringBitmap.add(Integer.valueOf(id.trim()))); roaringBitmap.runOptimize(); return roaringBitmap;}
// a + b - cprivate RoaringBitmap mergeBitmap(Lista, List b, List c) { // a + b List blacklistBitMaps = Lists.newLinkedList(); blacklistBitMaps.addAll(a); blacklistBitMaps.addAll(b); RoaringBitmap blacklistBitMap = aggregationToBitMap(blacklistBitMaps); // c RoaringBitmap whitelistBitMap = aggregationToBitMap(c); // a + b - c blacklistBitMap.andNot(whitelistBitMap); return blacklistBitMap;}private RoaringBitmap aggregationToBitMap(List list) { if (CollectionUtils.isEmpty(list)) { return new RoaringBitmap(); } if (list.size() == 1) { return list.get(0); } return FastAggregation.or(list.listIterator());}
2、和数据库Blob字段结合使用
create table hobby( id int auto_increment primary key, name varchar(255) not null, hobbies blob null);
// 忽略get、set方法public class HobbyDO { private Integer id; private String name; private RoaringBitmap bitmap;}public interface HobbyDOMapper { int insert(HobbyDO record); HobbyDO selectByPrimaryKey(Integer id); Integer updateBitmap(@Param("id") Integer id, @Param("bitmap") byte[] bitmap);}public class HobbyBitmapBlobHandler extends BaseTypeHandler{ @Override public void setNonNullParameter(PreparedStatement ps, int i, RoaringBitmap parameter, JdbcType jdbcType) throws SQLException { byte[] content = serializeRoaringBitmap(parameter); if (content == null) { return; } ByteArrayInputStream bis = new ByteArrayInputStream(content); ps.setBinaryStream(i, bis, content.length); } @Override public RoaringBitmap getNullableResult(ResultSet rs, String columnName) throws SQLException { return deSerializeRoaringBitmap(rs.getBlob(columnName)); } @Override public RoaringBitmap getNullableResult(ResultSet rs, int columnIndex) throws SQLException { return deSerializeRoaringBitmap(rs.getBlob(columnIndex)); } @Override public RoaringBitmap getNullableResult(CallableStatement cs, int columnIndex) throws SQLException { return deSerializeRoaringBitmap(cs.getBlob(columnIndex)); } private byte[] serializeRoaringBitmap(RoaringBitmap roaringBitmap) { if (roaringBitmap == null) { return null; } int size = roaringBitmap.serializedSizeInBytes(); ByteBuffer buffer = ByteBuffer.allocate(size); roaringBitmap.serialize(buffer); return buffer.array(); } private RoaringBitmap deSerializeRoaringBitmap(Blob blob) { if (blob == null) { return null; } byte[] content; try { content = blob.getBytes(1, (int) blob.length()); } catch (SQLException e) { e.printStackTrace(); return null; } ByteBuffer buffer = ByteBuffer.wrap(content); return new RoaringBitmap(new ImmutableRoaringBitmap(buffer)); }}
@Testpublic void insert() { HobbyDO hobby = new HobbyDO(); hobby.setName("lwh"); RoaringBitmap bitmap = new RoaringBitmap(); bitmap.add(111); bitmap.add(222); bitmap.add(333); hobby.setBitmap(bitmap); hobbyDOMapper.insert(hobby);}@Testpublic void update(){ RoaringBitmap bitmap = new RoaringBitmap(); bitmap.add(133); bitmap.add(222); bitmap.add(333); int size = bitmap.serializedSizeInBytes(); ByteBuffer buffer = ByteBuffer.allocate(size); bitmap.serialize(buffer); byte[] bitmapData = buffer.array(); hobbyDOMapper.updateBitmap(1, bitmapData);}@Testpublic void select(){ HobbyDO hobbyDO = hobbyDOMapper.selectByPrimaryKey(1); hobbyDO.getBitmap().forEach((IntConsumer) System.out::println);}到此,关于"RoaringBitmap的使用方法"的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注网站,小编会继续努力为大家带来更多实用的文章!
方法
使用方法
数据
学习
数字
数据库
字段
更多
帮助
实用
接下来
两个
字节
数值
数组
文章
方式
理论
知识
篇文章
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
网络安全护卫队面试
消息中间件和数据库联合事务
湖南网络安全培训线上学习
软件开发成本评估联盟
中物院软件开发
网页的内容怎么传递到数据库
网络技术和信息技术经营范围
软件开发技术总监kpi
网络安全设备运维方案
磅房管理访问不了服务器
icloud 服务器错误
apk服务器地址配置
vs下数据库搭建
国际服体验服服务器扩容
组策略设置代理服务器地址设置
德玛西亚服务器
android软件开发岗位
防止黑客攻击数据库服务器的有效策略包括
x86服务器和小型机
海南系统软件开发排行榜
江西综合软件开发价格大全
网络安全学院建设方案
唐山市网络安全和信息化
服务器端口是什么
软件开发各阶段评审
戴尔电脑服务器
计算机的网络安全技术包括
福建华为服务器维修调试哪家便宜
提示服务器没有响应
php传文件至数据库