【问题标题】:Boolean.parseboolean not working to evaluate a computed boolean expression [closed]Boolean.parseboolean 无法评估计算的布尔表达式[关闭]
【发布时间】:2021-07-11 23:58:40
【问题描述】:

我正在尝试解决一个 java 程序,我们必须评估一个字符串表达式并返回 true 或 false。表达式可能是这样的 s=(F&F|V|!V&!F&!(F|F&V)) 其中 V 代表真,F 代表假。我认为将 V 替换为 true 并将 F 替换为 false 会起作用。但是输出不符合预期如果我错了请告诉我。

我的代码是这样的

 String temp="";
 for(int i=0;i<s.length();i++)
 {
    char ch=s.charAt(i);
    if(ch=='V')
    {
        temp+="true";
        continue;
    }
    else if(ch=='F')
    {
        temp+="false";
        continue;
    }
    else
    {
        temp+=ch;
        continue;
    }           
 }
 boolean t=Boolean.parseBoolean(temp); 
 out.println(temp);
 out.println(t);
 return t;
            

【问题讨论】:

标签: java string boolean


【解决方案1】:

试试这个。

static boolean evalBooleanExpression(String s) {
    return new Object() {
        int index = 0;
        int ch = get();
        
        int get() { return ch = index < s.length() ? s.charAt(index++) : -1; }
        
        boolean eat(int ex) {
            while (Character.isWhitespace(ch))
                get();
            if (ch != ex) return false;
            get();
            return true;
        }
        
        boolean paren() {
            boolean r = expression();
            if (!eat(')')) throw new RuntimeException("')' expected");
            return r;
        }

        boolean factor() {
            boolean not = false;
            if (eat('!')) not = true;
            if (eat('V')) return !not;
            else if (eat('F')) return not;
            else if (eat('(')) return not ^ paren();
            else throw new RuntimeException("unknown char '" + ((char)ch) + "'");
        }

        boolean term() {
            boolean r = factor();
            while (eat('&'))
                r &= factor();
            return r;
        }

        boolean expression() {
            boolean r = term();
            while (eat('|'))
                r |= term();
            return r;
        }
        
        boolean parse() {
            boolean r = expression();
            if (ch != -1)
                throw new RuntimeException(
                    "extra string '" + s.substring(index - 1) + "'");
            return r;
        }

    }.parse();
}

String s = "(F&F | V |!V&!F&!(F| F&V))";
System.out.println(evalBooleanExpression(s));

输出:

true

【讨论】:

  • 是的,这有帮助..谢谢!
【解决方案2】:

Boolean.parseBoolean(s) 等价于"true".equalsIgnoreCase(s);它不计算逻辑表达式。相反,您可以使用 JavaScript 引擎。

import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
//...
try {
    String s = "(F&F|V|!V&!F&!(F|F&V))";
    ScriptEngine engine = new ScriptEngineManager().getEngineByName("JavaScript");
    boolean b = Boolean.parseBoolean(engine.eval(s.replace("F", "false")
       .replace("V", "true").replace("&", "&&").replace("|", "||")).toString());
    System.out.println(b);
} catch(ScriptException e){
    // Handle
    e.printStackTrace();
}

【讨论】:

  • 假设这是某种家庭作业,我希望一个可接受的解决方案需要实际解析表达式来评估它,而不仅仅是将其输入其他编译器。
  • 是的,但你能告诉我java中的替代方案吗……我是js新手,不知道如何使用引擎。解析转换或编译器评估布尔表达式是否有问题?
  • @samcodes007 我的回答展示了如何在 Java 中使用 JavaScript 引擎。它还解释了为什么Boolean.parseBoolean 不起作用。
  • @samcodes007 你可以在这里看到这个工作的演示:ideone.com/RxD0KD
  • 好吧,您可以等效地编写一个 Java 程序,该程序发出一个 Java 程序 boolean F=false, V=true, s=(F&amp;F|V|!V&amp;!F&amp;!(F|F&amp;V)) ; println(s);——当然,包装在通常的样板文件中——并将其提供给 Java 编译器。但这似乎是在回避这个问题。
猜你喜欢
  • 1970-01-01
  • 2013-12-15
  • 2017-12-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多