【已解决】Java中,判断:集合中是否包含指定元素(模糊匹配)比如权限中的user:list或者是user:*这种判断

背景描述

在工作中,有时候,我们需要对list中是否包含了指定元素进行判断,但是,有时候又需要支持模糊匹配,这个时候怎么办呢?

比如权限,我们知道,权限不仅可以配置完整的路径,也可以配置通配符。比如,系统管理员角色直接返回的权限是*。子公司A的管理员返回的是:departmentA:*的权限。子公司A的人事权限是:hrA:*。你自己登录系统后,返回的权限是:userA:view这个权限。类似这样的,一个人不止是只有一个权限。多个权限,那么这种情况下,想要判断集合中是否包含了指定元素,而且还需要模糊匹配,使用Java语言怎么写呢?凯哥(个人公众号:凯哥Java),接下来就讲讲怎么实现的。

思路:

  1. 简单匹配,如果list中包含了指定的元素(element)的时候,就直接返回;

  2. 如果list不包含,就开始模糊匹配

    循环list中每个元素:

     2.1. 如果元素中不包含【*】的时候,只需要简单的将list循环出来的数据和需要对比的元素进行equals比较即可;

    2.2:如果元素中包含了【*】的时候,就要进行第三步:深入匹配

  3.深入匹配

  将list循环出来的每个数据与需要匹配的元素每个字符进行比较。

具体代码如下:

一、定义函数接口,用来判断集合中是否包含指定元素

import java.util.List;
import java.util.function.BiFunction;/*** 函数式接口:判断集合中是否包含指定元素(模糊匹配)** <p>  参数:集合、元素  </p>* <p>  返回:是否包含  </p>** @author click33* @since 1.35.0*/
@FunctionalInterface
public interface SaHasElementFunction extends BiFunction<List<String>, String, Boolean> {}

二、开始进行对集合中是否包含了指定元素进行判断:

/*** 判断:集合中是否包含指定元素(模糊匹配)*/public SaHasElementFunction hasElement = (list, element) -> {// 空集合直接返回falseif(list == null || list.size() == 0) {return false;}// 先尝试一下简单匹配,如果可以匹配成功则无需继续模糊匹配if (list.contains(element)) {return true;}// 开始模糊匹配for (String patt : list) {if(SaFoxUtil.vagueMatch(patt, element)) {return true;}}// 走出for循环说明没有一个元素可以匹配成功return false;};

 简单匹配不成功后,开始模糊匹配:

/*** 字符串模糊匹配* <p>example:* <p> user* user-add   --  true* <p> user* art-add    --  false* @param patt 表达式* @param str 待匹配的字符串* @return 是否可以匹配*/public static boolean vagueMatch(String patt, String str) {// 两者均为 null 时,直接返回 trueif(patt == null && str == null) {return true;}// 两者其一为 null 时,直接返回 falseif(patt == null || str == null) {return false;}// 如果表达式不带有*号,则只需简单equals即可 (这样可以使速度提升200倍左右)if( ! patt.contains("*")) {return patt.equals(str);}// 深入匹配return vagueMatchMethod(patt, str);}	

元素中,不包含【*】,进行深入匹配:

/*** 字符串模糊匹配** @param pattern /* @param str    /* @return /*/private static boolean vagueMatchMethod( String pattern, String str) {int m = str.length();int n = pattern.length();boolean[][] dp = new boolean[m + 1][n + 1];dp[0][0] = true;for (int i = 1; i <= n; ++i) {if (pattern.charAt(i - 1) == '*') {dp[0][i] = true;} else {break;}}for (int i = 1; i <= m; ++i) {for (int j = 1; j <= n; ++j) {if (pattern.charAt(j - 1) == '*') {dp[i][j] = dp[i][j - 1] || dp[i - 1][j];} else if (str.charAt(i - 1) == pattern.charAt(j - 1)) {dp[i][j] = dp[i - 1][j - 1];}}}return dp[m][n];}

完整的匹配代码:

/*** 判断:集合中是否包含指定元素(模糊匹配)*/public SaHasElementFunction hasElement = (list, element) -> {// 空集合直接返回falseif(list == null || list.size() == 0) {return false;}// 先尝试一下简单匹配,如果可以匹配成功则无需继续模糊匹配if (list.contains(element)) {return true;}// 开始模糊匹配for (String patt : list) {if(SaFoxUtil.vagueMatch(patt, element)) {return true;}}// 走出for循环说明没有一个元素可以匹配成功return false;};/*** 字符串模糊匹配* <p>example:* <p> user* user-add   --  true* <p> user* art-add    --  false* @param patt 表达式* @param str 待匹配的字符串* @return 是否可以匹配*/public static boolean vagueMatch(String patt, String str) {// 两者均为 null 时,直接返回 trueif(patt == null && str == null) {return true;}// 两者其一为 null 时,直接返回 falseif(patt == null || str == null) {return false;}// 如果表达式不带有*号,则只需简单equals即可 (这样可以使速度提升200倍左右)if( ! patt.contains("*")) {return patt.equals(str);}// 深入匹配return vagueMatchMethod(patt, str);}/*** 字符串模糊匹配** @param pattern /* @param str    /* @return /*/private static boolean vagueMatchMethod( String pattern, String str) {int m = str.length();int n = pattern.length();boolean[][] dp = new boolean[m + 1][n + 1];dp[0][0] = true;for (int i = 1; i <= n; ++i) {if (pattern.charAt(i - 1) == '*') {dp[0][i] = true;} else {break;}}for (int i = 1; i <= m; ++i) {for (int j = 1; j <= n; ++j) {if (pattern.charAt(j - 1) == '*') {dp[i][j] = dp[i][j - 1] || dp[i - 1][j];} else if (str.charAt(i - 1) == pattern.charAt(j - 1)) {dp[i][j] = dp[i - 1][j - 1];}}}return dp[m][n];}

文章👉:凯哥个人博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/237383.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何直接使用别人的Python项目的虚拟环境

Cannot set up a python SDK at Python 3.10 (flaskTest) (2) (H:\WorkPlace\PyWorkPlace\flaskTest\flaskTest\venv\Scripts\python.exe). The SDK seems invalid 如何复制别人的虚拟环境 修改步骤 1. 修改pyvenv.cfg文件里的home和version 2. Scripts\activate以及Scripts\a…

【华为OD机试真题2023CD卷 JAVAJS】机器人仓库搬砖

华为OD2023(C&D卷)机试题库全覆盖,刷题指南点这里 机器人仓库搬砖 知识点二分查找字符串编程基础数组 题目描述:机器人搬砖,一共有N堆砖存放在N个不同的仓库中,第i堆砖中有bricks[i]块砖头,要求在8小时内搬完。机器人每小时能搬砖的数量取决于有多少能量格,机器人一…

【数字图像处理】实验一 图像基本运算

图像基本运算 一、实验内容&#xff1a; 1&#xff0e; 熟悉和掌握利用Matlab工具进行数字图像的读、写、显示等数字图像处理基本步骤。 2&#xff0e; 熟练掌握各种图像点运算的基本原理及方法。 3&#xff0e; 能够从深刻理解点运算&#xff0c;并能够思考拓展到一定的应用领…

【让云服务器更灵活】iptables转发tcp/udp端口请求

iptables转发tcp/udp端口请求 文章目录 前言一、路由转发涉及点二、转发如何配置本机端口转发到本机其它端口本机端口转发到其它机器 三、固化iptables总结 前言 路由转发是计算机网络中的一种重要概念&#xff0c;特别是在网络设备和系统之间。它涉及到如何处理和传递数据包&…

Html / CSS刷题笔记

WebKit是一个开源的浏览器引擎&#xff0c;它最初是由苹果公司开发的&#xff0c;并且被广泛用于Safari浏览器和其他基于WebKit的浏览器&#xff0c;比如Google Chrome的早期版本。它也是构建许多移动设备浏览器的基础。WebKit的主要功能是解析HTML和CSS&#xff0c;并将其渲染…

贝叶斯判别

参考文献&#xff1a; 6 判别分析 | 多元统计分析示例https://www.cnblogs.com/qizhou/p/13495598.html 一、问题描述 贝叶斯判别的本质是一类分类问题&#xff1a;基于若干采样样本&#xff0c;如何学习一个分类器对新样本数据进行分类并保证分类错误的概率最小。 假设 一…

Flink系列之:Savepoints

Flink系列之&#xff1a;Savepoints 一、Savepoints二、分配算子ID三、Savepoint 状态四、算子五、触发Savepoint六、Savepoint 格式七、触发 Savepoint八、使用 YARN 触发 Savepoint九、使用 Savepoint 停止作业十、从 Savepoint 恢复十一、跳过无法映射的状态恢复十二、Resto…

Linux服务器 部署飞书信息发送服务

项目介绍&#xff1a; 飞书信息发送服务是指将飞书信息发送服务部署到一个Linux服务器上。飞书是一款企业级的即时通讯和协作工具&#xff0c;支持发送消息给飞书的功能。通过部署飞书信息发送服务&#xff0c;可以方便内网发送信息给外网飞书。 项目代码结构展示&#xff1a; …

【Midjourney】Midjourney根据prompt提示词生成黑白色图片

目录 &#x1f347;&#x1f347;Midjourney是什么&#xff1f; &#x1f349;&#x1f349;Midjourney怎么用&#xff1f; &#x1f514;&#x1f514;提示词格式 &#x1f34b;&#x1f34b;应用示例——“秘密花园”式涂色书配图生成 &#x1f34c;&#x1f34c;例子1…

ardupilot开发 --- 风机不停机巡检 篇

在哪里创建的siyi实例&#xff1f; 如何传递飞控的时间戳给siyi相机&#xff1f; AP_RTC_ENABLED在waf编译时配置为1&#xff1f;&#xff1f; 如何配置&#xff1f; 在lua脚本中如何获取这个时间AP::rtc().get_utc_usec(utc_usec)&#xff1f;&#xff1f;&#xff1f; inclu…

微信小程序实现一个音乐播放器的功能

微信小程序实现一个音乐播放器的功能 要求代码实现wxml 文件wxss 文件js文件 解析 要求 1.页面包含一个音乐列表&#xff0c;点击列表中的音乐可以播放对应的音乐。 2.播放中的音乐在列表中有标识&#xff0c;并且可以暂停或继续播放。 3.显示当前音乐的播放进度和总时长&#…

AUTOSAR从入门到精通-诊断协议栈(DCM)(一)

目录 前言 知识储备 UDS 几个相关概念 Dcm模块原理 什么是DCM

什么是误差,什么是重构误差,误差与重构误差有什么区别?

重构误差 1.误差的概念2.重构误差的概念 1.误差的概念 在机器学习中&#xff0c;误差通常是指模型的输出与实际标签或者真实值之间的差异&#xff0c;通常用于评估模型的预测能力或者训练的优化过程。 2.重构误差的概念 重构误差是指通过学习到的模型来重新构建&#xff08;或…

HBase基础知识(二):HBase集群部署、HBaseShell操作

1. HBase安装部署 1.1 Zookeeper正常部署 首先保证Zookeeper集群的正常部署&#xff0c;并启动之&#xff1a; 创建集群启动脚本&#xff1a; #!/bin/bash case $1 in "start"){ for i in hadoop100 hadoop101 hadoop102 do echo----------zookeeper $i 启动----…

听GPT 讲Rust源代码--src/tools(19)

File: rust/src/tools/jsondoclint/src/json_find.rs json_find.rs文件是Rust源代码中jsondoclint工具的一部分。该工具用于在文档注释中查找JSON示例并验证其格式。 具体来说&#xff0c;json_find.rs文件定义了一个用于在文档注释中查找JSON示例的实用工具&#xff0c;它提供…

【YOLOV8预测篇】使用Ultralytics YOLO进行检测、分割、姿态估计和分类实践

目录 一 安装Ultralytics 二 使用预训练的YOLOv8n检测模型 三 使用预训练的YOLOv8n-seg分割模型 四 使用预训练的YOLOv8n-pose姿态模型 五 使用预训练的YOLOv8n-cls分类模型 <

基于SpringBoot的体育馆使用预约管理系统

文章目录 项目介绍主要功能截图:部分代码展示设计总结项目获取方式🍅 作者主页:超级无敌暴龙战士塔塔开 🍅 简介:Java领域优质创作者🏆、 简历模板、学习资料、面试题库【关注我,都给你】 🍅文末获取源码联系🍅 项目介绍 基于SpringBoot的体育馆使用预约管理系统…

ChatGPT 4 用实际案例来完成Excel求和函数用法与多条件求和

我们先让ChatGPT4来帮我们总结一下求和函数及条件求和函数的用法,并举例演示。 Excel中求和函数(SUM)是用来计算一列或多列单元格之和的函数。基本的使用方法如下: `=SUM(A1:A10)` 这公式会返回 A1 到 A10 单元格内所有数字的和。如果这些单元格中有非数字类型的值,它们…

nodejs+vue+微信小程序+python+PHP兴趣趣班预约管理系统设计与实现-计算机毕业设计推荐

当前社会各行业领域竞争压力非常大&#xff0c;随着当前时代的信息化&#xff0c;科学化发展&#xff0c;让社会各行业领域都争相使用新的信息技术&#xff0c;对行业内的各种相关数据进行科学化&#xff0c;规范化管理。 软件信息技术能够覆盖社会各行业领域是时代的发展要求&…

案例135:基于微信小程序的房屋租赁管理系统的设计与实现

文末获取源码 开发语言&#xff1a;Java 框架&#xff1a;SSM JDK版本&#xff1a;JDK1.8 数据库&#xff1a;mysql 5.7 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven3.5.4 小程序框架&#xff1a;uniapp 小程序开发软件&#xff1a;HBuilder X 小程序…