java二进制多字段匹配的方法
发表于:2025-02-05 作者:千家信息网编辑
千家信息网最后更新 2025年02月05日,这篇文章主要讲解了"java二进制多字段匹配的方法",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"java二进制多字段匹配的方法"吧!package u
千家信息网最后更新 2025年02月05日java二进制多字段匹配的方法
这篇文章主要讲解了"java二进制多字段匹配的方法",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"java二进制多字段匹配的方法"吧!
package util;/** ** 将多个int正整型合并为一个long型进行存储,并通过xor运算计算两组int是否匹配 * MultiEnumVal64 int正整数取值必须大于0,0值用于MultiVal64本身特殊计算使用,<=0表示不参与匹配计算。 * 如:业务中需要根据行人是否戴眼镜、是否戴帽子、衣服颜色来进行查询 * 是否戴眼镜取值: 1 未知 ; 2 戴眼镜 ; 3 不带眼镜 ; * 是否戴帽子取值: 1 未知 ; 2 戴帽子 ; 3 不带帽子 ; * 衣服的颜色取值: 1 未知 ; 2 红色 ; 3 绿色 ; 4 白色 ; * * 假设某一个抓拍体型数据为:眼镜=2; 帽子=1; 颜色=4 * 1、构建MultiVal64数据 ** */public class MultiEnumVal64 { /** * 所有属性最大值二进制的长度容器 */ private int[] config; /** * 忽略不参与匹配值的位置 */ private int[][] ignorePos; /** * 二进制数值 */ private long longVal; /** * 所有属性最大值二进制的长度综合 */ private int length; /** * 是否有不参与匹配标识 */ private boolean hasIgnoreVal = false; /** * 每一组int取值的最大值 * * @param maxValConfig */ public MultiEnumVal64(int... maxValConfig) { this.config = new int[maxValConfig.length]; this.ignorePos = new int[maxValConfig.length][2]; for (int index = 0; index < maxValConfig.length; index++) { int maxVal = maxValConfig[index]; if (maxVal < 0) { throw new IllegalArgumentException("value must be greater than 0"); } int tempLength = Integer.toBinaryString(maxVal).length(); this.config[index] = tempLength; length += tempLength; } if (length + 1 > 63) { throw new IllegalArgumentException(length + " over the maximum digit 62"); } } /** * 数值<=0 表示不参与计算 * * values要把所有值按顺序传入,比如说总共有10个属性,只匹配一个属性,要把剩下9个属性补上,用不参与匹配-1或0补位 * * @param values * @return */ public MultiEnumVal64 build(int... values) { if (values.length != this.config.length) { throw new IllegalArgumentException("value array length and config mismatch, config length is " + this.config.length + " , but value array length is " + values.length); } /** * 符号位最左边 */ StringBuilder binaryStr = new StringBuilder("1"); /** * 记录不参与匹配属性的下标 */ int preLength = 1; for (int i = 0; i < values.length; i++) { int binaryLength = this.config[i]; int maxConfigVal = (1 << binaryLength); int val = values[i]; /** * 当前属性值不能大于初始所规定当前属性的最大值 */ if (val > maxConfigVal) { throw new IllegalArgumentException("the " + i + " value should be less than or equal to " + maxConfigVal); } /** * 如果有不参与的属性标记为true,用0把最大占位补满 */ if (val <= 0) { hasIgnoreVal = true; for (int j = 0; j < binaryLength; j++) { binaryStr.append("0"); } /** * 记录不参与属性的位置 */ ignorePos[i][0] = this.length - preLength; ignorePos[i][1] = this.length - preLength - (this.config[i] - 1); } else { /** * 以下全是参与的属性,十进制转换二进制 */ String binaryVal = Integer.toBinaryString(val); /** * 如果当前二进制值长度比初始最大值小,那么用0补位 */ for (int j = 0; j < binaryLength - binaryVal.length(); j++) { binaryStr.append("0"); } binaryStr.append(binaryVal); /** * 用-1表示该属性不被忽略,所以不需要记录被忽略的位置 */ ignorePos[i][0] = -1; ignorePos[i][1] = -1; } /** * 实时追加下标才能准确计算到每个属性的在二进制中的位置 */ preLength += binaryLength; } /** * 将拼接成的二进制转换为十进制 */ this.longVal = Long.parseLong(binaryStr.toString(), 2); return this; } public MultiEnumVal64 build(long val) { this.longVal = val; build(getVals()); return this; } public long getLong() { return longVal; } /** * 将处理过的二进制通过字符截取还原成数组 * @return */ public int[] getVals() { int[] values = new int[this.config.length]; String binary = Long.toBinaryString(getLong()); int binaryLength = binary.length(); int endIndex = binaryLength; for (int i = this.config.length - 1; i >= 0; i--) { int startIndex = endIndex - this.config[i]; if (startIndex < 1) { if (endIndex > 1) { startIndex = 1; values[i] = Integer.parseInt(binary.substring(startIndex, endIndex), 2); } else { values[i] = -1; } } else { values[i] = Integer.parseInt(binary.substring(startIndex, endIndex), 2); } if (values[i] == 0) { values[i] = -1; } endIndex = startIndex; } return values; } public int[][] getIgnorePos() { return ignorePos; } public int getLength() { return length; } public long getComparVal() { long m1 = 0L; if (hasIgnoreVal) { for (int[] pos : ignorePos) { if (pos[0] > 0 || pos[1] > 0) { for (int start = pos[1]; start <= pos[0]; start++) { m1 = m1 ^ (1L << start); } } } } return m1; } public long transform(long val) { return val &~ getComparVal(); } public long xor(long val) { long v1 = transform(val); return v1 ^ getLong(); } public long xor(MultiEnumVal64 mv) { return xor(mv.getLong()); } public boolean xorTrue(long val) { return xor(val) == 0; } public boolean xorTrue(MultiEnumVal64 mv) { return xor(mv) == 0; } public boolean isHasIgnoreVal() { return hasIgnoreVal; }}* MultiEnumVal64 mv64 = new MultiEnumVal64(3,3,4); //创建MultiVal64对象,定义每一种属性的最大取值 ,定义的顺序为:眼镜、帽子、颜色 * mv64.build(2,1,4); //构造数据 * long longVal = mv64.getLong(); //获取long值,可存储于数据库 *
* 2、java编码匹配MultiVal64数据 ,沿用1、的例子 * a、场景1查询条件是:戴着帽子且戴着眼镜 ** MultiEnumVal64 mv642 = new MultiEnumVal64(3,3,4); //创建MultiVal64对象,定义每一种属性的最大取值 ,定义的顺序为:眼镜、帽子、颜色 * mv642.build(2,2,-1); //构造数据,-1表示不参与匹配,原始数据不论取何值都可以匹配成功 * System.out.printl(mv642.xorTrue(mv64)); //匹配数据,该场景返回false,因为是否戴眼镜项匹配不成功 *
* b、场景1查询条件是:戴着眼镜穿白色衣服 ** MultiEnumVal64 mv643 = new MultiEnumVal64(3,3,4); //创建MultiVal64对象,定义每一种属性的最大取值 ,定义的顺序为:眼镜、帽子、颜色 * mv643.build(2,-1,4); //构造数据,-1表示不参与匹配,原始数据不论取何值都可以匹配成功 * System.out.printl(mv643.xorTrue(mv64)); //匹配数据,该场景返回true *
* 3、数据库sql写法1,以场景2.->b为例 ** String sql = ""; * if(mv643.isHasIgnoreVal()) { * sql = "select * from table where column_name ("; * for (int[] pos : mv643.getIgnorePos()) { * if (pos[0] > 0 || pos[1] > 0) { * for (int start = pos[1]; start <= pos[0]; start++) { * sql + "& ~(1 << " + start + ")"; * } * } * } * sql += ") ^ " + mv643.getLong() + " = 0;"; * } else { * sql = "select * from table where column_name ^ " + mv643.getLong() + " =0;"; * } *
* 4、数据库sql写法2,以场景2.->b为例 ** String sql = ""; * if(mv643.isHasIgnoreVal()) { * sql = "select * from table where (column_name & ~"; * sql += mv643.getComparVal(); * sql += ") ^ " + mv643.getLong() + " = 0;"; * } else { * sql = "select * from table where column_name ^ " + mv643.getLong() + " =0;"; * } *
*
感谢各位的阅读,以上就是"java二进制多字段匹配的方法"的内容了,经过本文的学习后,相信大家对java二进制多字段匹配的方法这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是,小编将为大家推送更多相关知识点的文章,欢迎关注!
数据
属性
二进制
眼镜
最大
帽子
颜色
字段
方法
场景
最大值
顺序
成功
戴帽子
对象
数据库
衣服
长度
学习
查询
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
服务器电源订购
我的世界服务器怎么输账号密码
软件开发服务所需的资质
触摸屏图形界面软件开发
数据安全法与网络安全法相比
数据库搜索说对象名无效
服务器增加硬盘风险
有网却还是显示连接不了服务器
软件开发项目如何评估工程量
云平台软件开发流程
量子通信网络技术股票
青少年如何做好网络安全工作
普游互联网科技贵州安顺
手机版cf最好玩的服务器
用友查询数据库方法
常州昌都网络技术
网络安全审计人才
惠普服务器开机转一下
fm2015 03数据库
科技互联网公司政府补贴
2021全球软件开发大会二大
网络安全维护小方法
重庆拍拍网络技术有限公司
沈阳软件开发工作室
阿里巴巴网络技术公司图片
bbin挂机软件开发
下列哪一部门网络安全法
mysql 数据库集群
电脑服务器名称在哪儿看
树莓派做服务器可以吗