从arrayList评估布尔表达式

时间:2019-03-08 07:10:08

标签: java optimization boolean-operations javascript-engine

我从任何布尔表达式生成一个真值表,并将其存储到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]

但是我想知道是否还有其他方法可以这样做,因为对我而言,这种方法不是很性感。它很重,我有更多的变量,更长。另外,我问我是否要共享我的应用程序,是否可以在其他计算机上使用脚本。

感谢您的帮助

0 个答案:

没有答案