我正在寻找代表布尔代数的解决方案。
假设我有很多我正在向用户显示的String对象。他现在可以多选它们(在它们之间建立&& AND
连接),并且还可以建立|| OR
连接。最终表达式也应该向用户显示。
所以,例如,如果他选择String1, String2, String3
我想要呈现String1 && String2 && String3
。也许稍后用户应该能够构建像(String1 || String 2) && String 3
这样的表达式。
我的问题是:如何在字符串对象之间跟踪这些布尔选择的引用? 当然我可以创建一个String表达式;并总是追加他所选择的。但如果他取消选择一个对象呢?然后我必须解析整个字符串并重新评估它。
我正在寻找一些东西来保持对象之间的AND/OR
引用,然后有一个方法来构建基于这些的String final表达式。
欢迎任何想法!
答案 0 :(得分:2)
答案 1 :(得分:2)
您可以Lexical Analysis执行此操作。 java有许多词法生成器,如:JavaCC,JLex等。
或者您可以使用诸如前/后固定计算器或堆栈计算器之类的内容进行括号平衡并维护层次结构,最初由traversing through a "tree"完成并在该计算器中代替“1” - “9 “数字(以字符串形式出现)你必须匹配”true“或”false“并代替”+“,” - “二元运算符你必须匹配并操作”和“和”或“!
我已经制作了一个布尔代数解析器,因为我在之前的评论中已经提交过,我认为它有效,欢迎您加入并贡献: https://github.com/sadaf2605/Java-Boolean-Algebra-Parser
代码:
public class BooleanAlgebra {
static final String CONST_and="And";
static final String CONST_or="Or";
static final String CONST_true="True";
static final String CONST_false="False";
public static void main(String[] args) {
System.out.println(booleanAlgebra("False")==false);
System.out.println(booleanAlgebra("True")==true);
System.out.println(booleanAlgebra("False And False")==false);
System.out.println(booleanAlgebra("True And False")==false);
System.out.println(booleanAlgebra("True And True")==true);
System.out.println(booleanAlgebra("False And True")==false);
System.out.println(booleanAlgebra("(False And True)")==false);
System.out.println(booleanAlgebra("True Or (False And True)")==true);
System.out.println(booleanAlgebra("(True And False) And (False And True) Or True")==true);
System.out.println(booleanAlgebra("( (True And False) Or True )")==true);
System.out.println(booleanAlgebra("( False Or (True And (False Or True)) Or True )")==true);
}
static boolean booleanAlgebra(String str){
return TrueFalse(str, false, "Or");
}
static boolean TrueFalse(String s,boolean b, String op){
boolean btemp=false;
s=s.replaceAll(" ", "");
while(!s.isEmpty()){
if(s.startsWith(CONST_true)){
btemp=true;
s=s.substring(4);
}else if(s.startsWith(CONST_false)){
btemp=false;
s=s.substring(5);
}else if(s.startsWith(CONST_and)){
op=CONST_and;
s=s.substring(3);
}else if(s.startsWith(CONST_or)){
op=CONST_or;
s=s.substring(2);
}else if(s.startsWith("(")){
int end=s.indexOf(")");
if(end>0){
b=TrueFalse(s.substring(1, end>-1?end:1),b,op);
s=s.substring(end);
}
}else{
s=s.substring(1);
}
if (op.equals(CONST_and)){
b=b&&btemp;
}else if(op.equals(CONST_or)){
b=b||btemp;
}
}
return b;
}
}