Как преобразовать строку в логическое значение в Java? - PullRequest
0 голосов
/ 23 июня 2018

Я хочу преобразовать строку в логическое значение, но вывод всегда ложен.

a=true;
b=true;
c=true;
String zOrginal="(a^b)|c";
boolean z= Boolean.parseBoolean(zOrginal);
out.println(z);

Вывод всегда ложный,

Ответы [ 5 ]

0 голосов
/ 23 июня 2018

Существует несколько способов преобразования строки в логическое значение:

  1. Использование Boolean.valueOf (StringVal) Метод:

    public class Test {
       public static void main(String[] args) {
         String val = "false";
         boolean result=Boolean.valueOf(val);
         System.out.println(result);
       }
    }
    

    В этом случае значение true возвращается тогда и только тогда, когда строка имеет значение "true", в противном случае возвращается значение false.

  2. вы можете создать свой собственный метод для проверки строкового значения и на его основе возвращать true или false.

    public class Test {
    
       public static void main(String[] args) {
         String val = "true";
         boolean result=getBoolean(val);
         System.out.println(result);
       }
    
       public static boolean getBoolean(String value)
       {
        return "true".equalsIgnoreCase(value) ? true : false;
       }
    }
    
0 голосов
/ 23 июня 2018

Если вы хотите оценить результат выражения "(a^b)|c", где a, b и c - переменные, определенные выше, просто выполните выражение непосредственно как код Java, как указано в других ответах.

boolean result = (a|b)^c;

Однако, если кто-то действительно хочет оценить выражение, полученное из String, скажем, когда строка поступает из пользовательского ввода, есть библиотека JExl, которая позволяет вам сделать это:

http://commons.apache.org/proper/commons-jexl/

Добавьте следующие строки в свой maven pom.xml

<dependency>
  <groupId>org.apache.commons</groupId>
  <artifactId>commons-jexl3</artifactId>
  <version>3.1</version>
</dependency>

Вы не тестировали приведенный ниже код, но можете попробовать.

import org.apache.commons.jexl3.*;

JexlEngine jexl = new JexlBuilder().create();
String expression = "(a|b)^c";
JexlExpression jExpression = jexl.createExpression(expression);

// JexlContext stores the values for variables used in an JexlExpression
JexlContext context = new MapContext();
context.set("a", true);
context.set("b", true);
context.set("c", true);

// evaluate expression.
Long result = (Long) jExpression.evaluate(context);
System.out.println(result); // 0 for false

Конечно, производительность будет хуже, чем выполнение кода напрямую, потому что выражение должно быть проанализировано в абстрактном синтаксическом дереве (AST), прежде чем его можно будет оценить.

0 голосов
/ 23 июня 2018

Вы должны оценивать выражение напрямую, а не в строке.

boolean a,b,c;
a=true;
b=true;
c=true;
boolean z= (a^b)|c;
System.out.println(z);
0 голосов
/ 23 июня 2018

В Java метод parseBoolean анализирует строковый аргумент как логическое значение. Возвращаемое логическое значение представляет значение true, если строковый аргумент не равен нулю и равен (без учета регистра) строке “true”.

Итак, если вы проанализируете "(a^b)|c", вы получите false, поскольку оно не будет оценивать выражение.

0 голосов
/ 23 июня 2018

Это исходный код для Boolean.parseBoolean:

public static boolean parseBoolean(String b) 
{
  return "true".equalsIgnoreCase(b) ? true : false;
}

Единственный раз, когда эта функция возвращает true, это когда строка, переданная ей, либо "true" (независимо от регистра).

Если вы хотите проверить, не является ли строка непустой, используйте метод String.isEmpty.Если вы действительно хотите «вывести» строку, это не так просто ... но вы можете прочитать Есть ли в Java функция eval ()? .

...