假设你有一行 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. C#里的var和dynamic区别到底是什么,你真的搞懂了嘛

    前言 这个var和dynamic都是不确定的初始化类型,但是这两个本质上的不同.不同在哪儿呢?var编译阶段确定类型,dynamic运行时阶段确定类型.这种说法对不对呢?本篇看下 概括 以下详细叙述下 ...

  2. 认识Java注解

    1.注解是什么? 注解,元数据的一种形式,提供与程序有关的数据,但又不是程序的一部分.注解对它们注解的代码操作没有直接影响. 附注:元数据是指用来描述数据的数据,更通俗一点,就是描述代码间关系,或者代 ...

  3. ChatGPT使用案例,助你快速上手,做事事半功倍

    ChatGPT介绍 首先我们来看一下chat-gpt自己的介绍: ChatGPT的发展历程 2015年,OpenAI成立,致力于研究和开发人工智能技术.在成立初期,OpenAI的创始人之一Elon M ...

  4. LeetCode 双周赛 107(2023/06/24)滑动窗口与离散化

    本文已收录到 AndroidFamily,技术和职场问题,请关注公众号 [彭旭锐] 和 [BaguTree Pro] 知识星球提问. 往期回顾:LeetCode 单周赛第 348 场 · 数位 DP ...

  5. Redis基础(二)——列表操作、redis管道、Django中使用redis

    Redis列表操作 ''' lpush(name,values) rpush(name, values) 表示从右向左操作 lpushx(name,value) rpushx(name, value) ...

  6. ASP.NET Core 6框架揭秘实例演示[42]:检查应用的健康状况

    现代化的应用及服务的部署场景主要体现在集群化.微服务和容器化,这一切都建立在针对部署应用或者服务的健康检查上.ASP.NET提供的健康检查不仅可能确定目标应用或者服务的可用性,还具有健康报告发布功能. ...

  7. gRPC vs. HTTP:网络通信协议的对比

    概述 gRPC 和 HTTP 是两种常见的网络通信协议,用于在客户端和服务器之间进行通信.它们具有不同的特点和适用场景,下面对它们进行详细比较. HTTP(Hypertext Transfer Pro ...

  8. 2023-07-08:RabbitMQ如何做到消息不丢失?

    2023-07-08:RabbitMQ如何做到消息不丢失? 答案2023-07-08: 1.持久化 发送消息时设置delivery_mode属性为2,使消息被持久化保存到磁盘,即使RabbitMQ服务 ...

  9. async/await初学者指南

    JavaScript中的async和await关键字提供了一种现代语法,帮助我们处理异步操作.在本教程中,我们将深入研究如何使用async/await来掌控JavaScript程序中的流程控制. 总览 ...

  10. Spring 的依赖注入

    Spring 的依赖注入 @ 目录 Spring 的依赖注入 每博一文案 1. 依赖注入 1.1 构造注入 1.1.1 通过参数名进行构造注入 1.1.2 通过参数的下标,进行构造注入 1.1.3 不 ...