假設你有一行 String condition = "A or B and C"; 語句,請問怎麼做才能變成一行真正的邏輯表達式(能在電腦中運行計算)? Resolution 聲明一個List<List<String>>結構; 先分割 or ; 變成 [ A, B and C ] 不包含and的, ...
假設你有一行 String condition = "A or B and C";
語句,請問怎麼做才能變成一行真正的邏輯表達式(能在電腦中運行計算)?
Resolution
- 聲明一個
List<List<String>>
結構; - 先分割 or ;
變成 [ A, B and C ] - 不包含and的,插入
List<List<String>>
結構;
List<List<String>>
.add( [A] ) - 聲明一個
List<String>
, 再分割 and;
List<String>
.add(B);
List<String>
.add(C); - 把④加入
List<List<String>>
結構,
List<List<String>>
.add( [B, C]); - 最終
List<List<String>>
結構如下:
[ [A], [B,C] ] - 這個
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。
思路就是:
- 先將所有語句都併列成一句來分析,
NO A OR B AN C
=A OR (B AN C)
,就能看出整體性的邏輯; - 迴圈所有語句;
- 先將第一行的NO 語句存儲起來;
- Next 無非就是
AN
或OR
兩種情況,針對這兩個條件分別做不同的處理即可;
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?