我从任何布尔表达式生成一个真值表,并将其存储到2D数组中。第一步,我将布尔表达式存储在对象arrayList中。我计算变量的数量以扣除列数(变量)和行数(组合)。
nbrVariables = variables.size();
nbrCombinaisons = (int)Math.pow(2,variables.size());
truth_table = new int [nbrCombinaisons][nbrVariables+1];
我声明 nbrVariables + 1 ,因为我需要1列代表我的输出。使用循环,我生成了真值表的每个组合。
我在控制台中有此内容:
---- Equation : [soccer, +, food]
---- Variables : [soccer, food]
variables : 2
combinaisons : 4
header : [food, soccer]
[0, 0, null]
[0, 1, null]
[1, 0, null]
[1, 1, null]
如您所见,我最后一列的每个元素都为空。为了完成代表我的输出的这一列,我需要为每个组合评估我的布尔表达式。我重申我的布尔表达式是Objects的arrayList。
要完成此操作,我使用字符串缓冲区来使用一个脚本,该脚本针对每个组合(=每行)评估我的布尔表达式。
public void getOutput() throws ScriptException{
StringBuffer sbExpr = new StringBuffer();
temp= new ArrayList<Object>();
temp.addAll(equation);
for(int i=0; i<=nbrCombinaisons-1; i++){
for (int j=0; j<=nbrVariables-1 ; j++){
if(equation.contains(variables.get(j).getName())){
temp.set(equation.indexOf(variables.get(j).getName()), truth_table[i][j]);
}
}
truth_table[i][nbrVariables]= getResult(temp, sbExpr );
}
}
public int getResult(ArrayList<Object> temp, StringBuffer sbExpr) throws ScriptException{
sbExpr.delete(0, sbExpr.length());
for(int i =0; i< temp.size(); i++){
if(temp.get(i).equals(1)){
sbExpr.append("1");
}else if(temp.get(i).equals(0)){
sbExpr.append("0");
}else if(temp.get(i).getClass().equals(String.class))
switch((String)temp.get(i))
{
case "+":
sbExpr.append("|");
break;
case ".":
sbExpr.append("&");
break;
case "¤":
sbExpr.append("^");
break;
case "!":
sbExpr.append("!");
break;
case "(":
sbExpr.append("(");
break;
case ")":
sbExpr.append(")");
break;
default:
System.out.println("no match");
}
}
// System.out.println("\nsbExpr -----> " +sbExpr );
ScriptEngineManager sem = new ScriptEngineManager();
ScriptEngine se = sem.getEngineByName("JavaScript");
if (se.eval(sbExpr.toString()).toString().equals("1")){
return 1;
}else{
return 0;
}
}
这很好。
[PCU, Fuel circuit]
[0, 0, 0]
[0, 1, 1]
[1, 0, 1]
[1, 1, 1]
但是我想知道是否还有其他方法可以这样做,因为对我而言,这种方法不是很性感。它很重,我有更多的变量,更长。另外,我问我是否要共享我的应用程序,是否可以在其他计算机上使用脚本。
感谢您的帮助