开发背景

我们在开发过程中,可能需要将某数据动态从配置文件中读取。且需要根据用户的输入,来动态判断决定某布尔值。

例如:

我们有一个配置,称为配置一,需要在配置文件中写好,该配置有3个子配置(姑且这么叫吧),3个子配置是否选择,需要根据用户的页面输入。

我们又有一个配置,称为配置二,需要在配置文件中写好,该配置有2个子配置,2个子配置是否选择,需要根据配置二中的其他配置项来决定是否需要选择。

(可能以上例子表述并不完整,但并不影响本文的继续进行)

有时候,我们需要在配置文件中添加一个字段,通过该字段来确认一个动态的布尔值,这个字段是一个逻辑的表达式。(例:a==b && student.id == stusdent .num)

但是,配置文件拿到的只能是字符串。因此需要解析字符串,返回布尔值。

输入(参数):

除了要输入字符串外,还需要输入字符串中需要用到的数据集。

例如student.id == stusdent .num 这个表达式,就需要student对象

输出(返回值):

布尔值:true 或者 false

代码:

package com.dacheng.kyc.com.dacheng.kyc;import java.util.HashMap;
import java.util.Map;
import java.util.Stack;import org.springframework.util.StringUtils;public class getEnableService {private static final String AND ="&&";private static final String OR ="||";private static final String UNEQUAL = "!=";private static final String EQUAL = "==";private Map<String, String> map;private Map<String, String> params;public boolean isEnable(String enable, Map<String, String> map,Map<String,String> params){this.map = map;this.params = params;if(StringUtils.isEmpty(enable)){return true;}Stack<String> operation = new Stack<String>();int tmpEnd = enable.length();for(int i = enable.length();i>1 ; i--){String twoChatter = enable.substring(i-2,i);if (twoChatter.equals(AND)||twoChatter.equals(OR)) {operation.add(enable.substring(i, tmpEnd).trim().replaceAll(" ", ""));operation.add(twoChatter);tmpEnd = i-2;}}operation.add(enable.substring(0,tmpEnd).replaceAll(" ", ""));System.out.println(operation);return judge(operation);}private boolean judge(Stack<String> operation) {if(operation.size()==1) {return isTrue(operation.pop());}else {boolean value1 = isTrue(operation.pop());String releation = operation.pop();boolean value2 = isTrue(operation.pop());if (releation.equals(AND)) {boolean operationResult =  value1 && value2;operation.add(String.valueOf(operationResult));return judge(operation);}else if(releation.equals(OR)) {boolean operationResult =  value1 || value2;operation.add(String.valueOf(operationResult));return judge(operation);}else {//LOG.error("the logical is wrong")return true;}}}private boolean isTrue(String condition) {if(condition.toLowerCase().equals("true")) {return true;}else if(condition.toLowerCase().equals("false")) {return false;}else {if(condition.contains(EQUAL)) {int index = condition.indexOf(EQUAL);String stringOfValue1 = condition.substring(0, index);String stringOfValue2 = condition.substring(index+2,condition.length());Object value1 = getValuFromString(stringOfValue1,params,map);Object value2 = getValuFromString(stringOfValue2,params,map);System.out.println(stringOfValue1+":"+value1);System.out.println(stringOfValue2+":"+value2);if(value1==null || value2 ==null) {//LOG.error();return false;}return value1.equals(value2);}else if (condition.contains(UNEQUAL)) {int index = condition.indexOf(UNEQUAL);String stringOfValue1 = condition.substring(0, index);String stringOfValue2 = condition.substring(index+2,condition.length());Object value1 = getValuFromString(stringOfValue1,params,map);Object value2 = getValuFromString(stringOfValue2,params,map);System.out.println(stringOfValue1+":"+value1);System.out.println(stringOfValue2+":"+value2);if(value1==null || value2 ==null) {//LOG.error();System.out.println("wrong");return false;}return !value1.equals(value2);}else {System.out.println("wrong");return false;}}}private Object getValuFromString(String configString, Map<String, String> params,
Map<String, String> map) {// TODO 这个函数主要是根据configString的知道,从其他参数里面获取想要的ValueString POINT ="\\.";String PARAMS ="params";String MAP ="map";String result = null;if (!StringUtils.isEmpty(configString) && configString.split(POINT).length == 1) {result = configString;} else if (!StringUtils.isEmpty(configString) &&configString.split(POINT).length == 2) {String source = configString.split(POINT)[0];String value = configString.split(POINT)[1];if (source.equals(PARAMS)) {result = params.get(value);} else if (source.equals(MAP)) {result = map.get(value);} }return result;}public static void main(String[] args) {Map<String ,String> map =new HashMap<>();Map<String ,String> params =new HashMap<>();map.put("name", "kangyucheng");params.put("name", "kangyucheng");map.put("id", "https://blog.csdn.net/kangyucheng");params.put("id", "https://blog.csdn.net/kangyucheng");getEnableService getEnableService =new getEnableService();String string1 ="params.name == map.name || params.id != map.id";System.out.println(getEnableService.isEnable(string1,map,params));String string2 ="params.name == map.id || params.id != map.id";System.out.println(getEnableService.isEnable(string2,map,params));String string3 ="params.name == map.id || params.id != true";System.out.println(getEnableService.isEnable(string3,map,params));}}

结果:

[params.id!=map.id, ||, params.name==map.name]
params.name:kangyucheng
map.name:kangyucheng
params.id:https://blog.csdn.net/kangyucheng
map.id:https://blog.csdn.net/kangyucheng
true
[params.id!=map.id, ||, params.name==map.id]
params.name:kangyucheng
map.id:https://blog.csdn.net/kangyucheng
params.id:https://blog.csdn.net/kangyucheng
map.id:https://blog.csdn.net/kangyucheng
false
[params.id!=true, ||, params.name==map.id]
params.name:kangyucheng
map.id:https://blog.csdn.net/kangyucheng
params.id:https://blog.csdn.net/kangyucheng
true:true
true

分析:

该实现方式采用栈来实现,首先遍历一次整个字符串,将字符串切分,将切分结果入栈。

然后开始对栈进行遍历,每次拿出一个符号和两个表达式,将结果计算好之后再放回栈中。如此递归到栈中只有一个元素。

缺陷:

1、并没有实现对括号的处理。

2、没有对>=  ,<= ,< ,>等等等关系进行处理,只处理了== 和 != 。

之所以没有对上述两个进行处理,是因为我觉得配置文件是自己来编写,且无需太复杂,以上代码可以完成需要。

(换一种说法:我有点懒)

java将字符串逻辑表达式转成布尔值相关推荐

  1. javascript - js中将字符串转成布尔值

    表单中按钮获取的值是字符串string类型,但是提交给后台的数据需要布尔值. 有以下三种方式进行转换: 1.使用JSON.parse()将字符串'true'.'false'转换成布尔值 字符串'tru ...

  2. java 将字符串集合转换成字符串并以顿号隔开

    要将字符串集合转换成以顿号隔开的字符串,可以使用 Java 的 StringJoiner 类. 例如,假设你有一个字符串集合,你想要将它们转换成一个字符串,并以顿号隔开,你可以这样做: import ...

  3. JavaCompiler实战:将Java源代码字符串动态编译成java类

    .首先我们来认识一下 java中的一个对象 JavaCompiler JavaCompiler : 不知道肯定很陌生,其实这个api出来很久了,他是jdk6的特性,用来编译java的源程式的,详细介绍 ...

  4. java 字符串写入word,JAVA 将字符串hollow 替换成word肿么实现?

    试试吧,注意要在所读取的文件里在每一行前加一个空格啊,然后测试就可以了 import java.io.BufferedReader; import java.io.BufferedWriter; im ...

  5. Python:赋值语句和布尔值

    一.赋值语句 1.序列解包 多个赋值同时进行: >>> x,y,z = 1, 2, 3 >>> print(x, y, z) 1 2 3 变量交换: ''' 遇到问 ...

  6. JavaScript读书笔记(三)布尔值,null,undefined,全局对象,包装对象

    参照内容来自<JavaScript权威指南> 布尔值 任意JavaScript的值都可以转换为布尔值. 部分值会被转换为false,其他转换为true. 会被转换为false的有:(1)u ...

  7. html js布尔值怎么定义,使用Javascript怎么对布尔值取反

    Javascript脚本语言同其他语言一样,有它自身的基本数据类型,表达式和算术运算符及程序的基本程序框架.Javascript提供了四种基本的数据类型和两种特殊数据类型用来处理数据和文字. 取反运算 ...

  8. 犀牛书第七版学习笔记:数据类型与结构-布尔值

    目录 1.逻辑判断功能 2. 布尔值转换 1.将其他类型转为布尔值 2.将布尔值转化为其他类型 3.布尔值操作符boolean operators 布尔表示一个逻辑实体 Boolean represe ...

  9. python中布尔类型的值包括_Python 布尔值(Booleans)

    1.布尔值(Booleans) 在编程中,您通常需要知道表达式是True还是False. 您可以评估Python中的任何表达式,并获得两个答案之一,True或False. 比较两个值时,将对表达式求值 ...

最新文章

  1. 无需Grouping,中科大和微软亚研院提出Group-Free的三维物体检测方法,性能远超之前最好方法。...
  2. Codeforces1080F. Katya and Segments Sets
  3. nacos 下线接口_微服务架构nacos注册中心为什么那么火
  4. MySQL免安装版 图文教程【5.7版本,纯净版win7安装】
  5. 使用番茄助手 快速注释
  6. 百度网盘提取码_百度网盘提取码查询终结版
  7. JS判断数组是否相同
  8. 现代opengl 设计 assimp 3D 模型加载库
  9. 从未在一起更让人遗憾_我们从未在一起更遗憾
  10. 百度竞价广告的URL设置
  11. 8. Celery 4.3.0 Periodic Tasks 周期性任务调度
  12. routing-controllers工作原理解析
  13. 硬盘柱面损坏怎么办_硬盘扇区损坏怎么办
  14. 微信公众号(一) --- 开启微信公众号服务
  15. 《Windows 8 权威指南》——2.8 Metro版IE10,探测Windows 8 Metro应用的撒手锏
  16. OpenCV 2 计算机视觉编程手册
  17. python unpacking_python packing unpacking 组包解包
  18. 网格员计算机考试基础知识,网格员考题_请问下网格员考试的内容题目是什么要复习什么_淘题吧...
  19. 学习大数据有推荐的么
  20. Linux——DHCP篇

热门文章

  1. source insight(SI)怎么显示全路径?(不显示省略路径)(关闭Trim long path names with ellipses)
  2. Win10如何打开软键盘?
  3. cudnn问题 cudnnCreate 延时长 见效慢 要卡十几分钟才能过 如何解决?(229)
  4. java 获取md5值报错_java获取文件的MD5值
  5. 树莓派光照传感器java_树莓派上使用光照强度检测(BH1750)传感器
  6. JVM 年轻代(Eden、From、To)、老年代讲解
  7. 织梦熊掌号插件兼容php5.3,DedeCMS百度熊掌号推送插件下载
  8. centos llvm安装_在CentOS上编译安装llvm-3.8.1详细教程
  9. mysql 数据迁移_mysql实验--不同字符集数据库迁移步骤演示
  10. webuploader在bootstrap模态对话框中选择文件按钮无效的问题