假设你有一行 String condition = "A or B and C"; 语句,请问怎么做才能变成一行真正的逻辑表达式(能在计算机中运行计算)?

Resolution

  1. 声明一个List<List<String>>结构;
  2. 先分割 or ;

    变成 [ A, B and C ]
  3. 不包含and的,插入List<List<String>>结构;

    List<List<String>> .add( [A] )
  4. 声明一个List<String>, 再分割 and;

    List<String>.add(B);

    List<String>.add(C);
  5. 把④加入List<List<String>>结构,

    List<List<String>>.add( [B, C]);
  6. 最终List<List<String>>结构如下:

    [ [A], [B,C] ]
  7. 这个List<List<String>>结构里面的条件语句就是任意一行必须为真语句,简而言之:判断A是不是为真,A为真则整个结构都为真, 或者判断[B, C]是否都为真,如果都为真则整个结构都为真。以此类推。

Example 2

如果是从文本里一行一行的读取用户的自定义配置,并且每行后面是一些特殊的Payload,就有可能会混着OR 、AND 语句,那就不适合使用上面的分割法,容易将Payload也分割了。

NO, IamSentence A
OR, IamSentence B
AN, IamSentence C

先固定Text的逻辑关键词的长度,NO表示第一行,OR=or, AN=and。

思路就是:

  1. 先将所有语句都并列成一句来分析,NO A OR B AN C = A OR (B AN C),就能看出整体性的逻辑;
  2. 循环所有语句;
  3. 先将第一行的NO 语句存储起来;
  4. Next 无非就是 ANOR两种情况,针对这两个条件分别做不同的处理即可;

Java代码实现该算法:

   public static void main(String[] args) {
List<String> rawSentence = new ArrayList<String>();
rawSentence.add("NO, IamSentence A");
rawSentence.add("OR, IamSentence B");
rawSentence.add("AN, IamSentence C"); parseAnOr(rawSentence);
} public static List<List<String>> parseAnOr(List<String> rawSentence) { List<List<String>> allList = new ArrayList<>();
String temp = "";
String last = "";
ArrayList<String> tempList = new ArrayList<String>(); for (int i = 0; i < rawSentence.size(); i++) { if (rawSentence.get(i).substring(0, 2).equals("NO")) {
last = rawSentence.get(i).substring(3);
last = last.trim();
}
if (rawSentence.get(i).substring(0, 2).equals("OR")) {
if (!last.equals("")) {
tempList.add(last);
last = "";
allList.add(new ArrayList<>(tempList));
tempList.clear();
}
if (tempList.size() > 0) {
allList.add(new ArrayList<>(tempList));
tempList.clear();
}
//
last = rawSentence.get(i).substring(3);
last = last.trim();
tempList.clear();
}
if (rawSentence.get(i).substring(0, 2).equals("AN")) {
tempList.add(last);
last = "";
last = rawSentence.get(i).substring(3);
last = last.trim();
}
}
if (!last.equals("")) {
tempList.add(last);
allList.add(new ArrayList<>(tempList));
} System.out.println(allList);
return allList;
}

out

[[IamSentence A], [IamSentence B, IamSentence C]]

Practice

If it were A or B and C and D or E, what would you do?

How to parse OR AND within text的更多相关文章

  1. 使用 JSON.parse 反序列化 ISO 格式的日期字符串, 将返回Date格式对象

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  2. go标准库的学习-text/template

    参考:https://studygolang.com/pkgdoc 导入方式: import "text/template" template包实现了数据驱动的用于生成文本输出的模 ...

  3. How to return plain text from AWS Lambda & API Gateway

    With limited experience in AWS Lambda & API Gateway, it's struggling to find the correct way to ...

  4. JSON对象和JSON字符串以及JSON.parse 函数的使用

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  5. JSON.parse 的用法,在js中用的。也是反序列化用法。

    参数 text 必需. 一个有效的 JSON 字符串. reviver 可选. 一个转换结果的函数. 将为对象的每个成员调用此函数. 如果成员包含嵌套对象,则先于父对象转换嵌套对象. 对于每个成员,会 ...

  6. 从 Newtonsoft.Json 迁移到 System.Text.Json

    一.写在前面 System.Text.Json 是 .NET Core 3 及以上版本内置的 Json 序列化组件,刚推出的时候经常看到踩各种坑的吐槽,现在经过几个版本的迭代优化,提升了易用性,修复了 ...

  7. C# ListView点击列头进行排序

    /// <summary> /// This class is an implementation of the 'IComparer' interface. /// </summa ...

  8. J2EE项目开发中常用到的公共方法

    在项目IDCM中涉及到多种工单,包括有:服务器|网络设备上下架工单.服务器|网络设备重启工单.服务器光纤网线更换工单.网络设备撤线布线工单.服务器|网络设备替换工单.服务器|网络设备RMA工单.通用原 ...

  9. Java 中类型转换

    int -> String int i=12345; String s=""; 第一种方法:s=i+""; 第二种方法:s=String.valueOf( ...

  10. C#算法知识点记录

    针对算法的知识点进行记录 简易桶排序 首先看一个简易桶排序,有一串数字,进行从大到小排列.数字间隔不大,使用一维数组来当作桶,进行插入排序. static void Main(string[] arg ...

随机推荐

  1. 企业battle宝典Q1 每一个身处于抑郁与困难的朋友必看!

    里面有看不懂的可以留言,我会解释!

  2. 【Unity3D】魔方

    1 需求实现 ​ 绘制魔方 中基于OpenGL ES 实现了魔方的绘制,实现较复杂,本文基于 Unity3D 实现了 2 ~ 10 阶魔方的整体旋转和局部旋转. ​ 本文完整代码资源见→基于 Unit ...

  3. TheTransformerPlaybookforNLPandLanguageUnderstanding

    目录 2.1 基本概念解释 2.2 技术原理介绍 2.3 相关技术比较 3. 实现步骤与流程 3.1 准备工作:环境配置与依赖安装 3.1.1 准备工作:环境配置与依赖安装 3.1.2 核心模块实现 ...

  4. [随笔]记一此更新win10后mysql服务消失的问题

    十几天前系统自动更新 没在意 几天前用php连mysql的时候 报错 Fatal error: Uncaught PDOException: SQLSTATE[HY000] [2002] 由于目标计算 ...

  5. 如何将视频文件.h264和音频文件.mp3复用为输出文件output.mp4?

    一.初始化复用器 在这个部分我们可以分三步进行:(1)打开输入视频文件上下文句柄 (2)打开输入音频文件上下文句柄 (3)打开输出文件上下文句柄 1.打开输入视频文件上下文句柄 在这一步,我们主要用到 ...

  6. 阿里云容蓓:DCDN 助力云原生时代的应用构建及最佳实践

    在数字化转型速度不断提升的今天,大带宽.低时延.高并发的场景不断涌现,内容分发网络(Content Delivery Network,CDN)应用需求还在不断攀升,打造更高质量的CDN服务将成为新时代 ...

  7. 解决连接MySQL,报错10061,系统错误5

    mysql登录不上去,报错10061,百度后得,mysql服务未启动.. 方法一.选择dos窗口命令行打开mysql 输入代码 net start mysql 报错,如图所示.系统错误 5 解决办法: ...

  8. dash构建多页应用

    dash 构建多页面应用一种方案 本方案对dash官网多页面案例使用dash_bootstrap_components案例进行优化与测试,效果如下 项目代码结构如下 │ app.py │ ├─asse ...

  9. 关于win11没有gpedit.msc(本地组策略管理)的解决方案

    转载自 https://blog.csdn.net/Xingchen0101/article/details/128943201 在本地部署一个bat文件 里面粘贴以下文本 pushd "% ...

  10. 2023年郑州轻工业大学校赛邀请赛zxy

    第一次组队和大家去外校打比赛,真的是一次很棒的体验,尽管结果不尽人意,但总之收获颇丰,也认识到自身更多的不足. 本次比赛是三人一队,一台电脑,一分纸质试题,我们三人开始先从第一题开始,这题看起来还行, ...