Как преобразовать строку в выражение if? [Дубликат]

$ dbc возвращает false. В вашем запросе есть ошибка:

  Пользователь SELECT. *, Профиль. * - Вы не присоединяетесь к профилю в любом месте.  FROM users INNER JOIN contact_info ON contact_info.user_id = users.user_id WHERE users.user_id = 3 ");  

Исправление для этого вообще описано Raveren.

20
задан adarshr 6 June 2012 в 17:04
поделиться

8 ответов

Вот пример использования стандартной (Java 1.6+) скриптовой библиотеки:

import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;

public class Test {

    public static void main(String[] args) throws Exception {
        ScriptEngineManager factory = new ScriptEngineManager();
        ScriptEngine engine = factory.getEngineByName("JavaScript");

        engine.eval("value = 10");
        Boolean greaterThan5 = (Boolean) engine.eval("value > 5");
        Boolean lessThan5 = (Boolean) engine.eval("value < 5");

        System.out.println("10 > 5? " + greaterThan5); // true
        System.out.println("10 < 5? " + lessThan5); // false
    }
}
32
ответ дан assylias 16 August 2018 в 00:04
поделиться
  • 1
    Я занимаюсь java годами, а не через месяц, когда я не ищу что-то новое. Я не уверен, хорошо это или плохо. – NimChimpsky 6 June 2012 в 17:10
  • 2
    Он бросает исключение NullPointerException в LOC: engine.eval («значение = 10»); Какая может быть возможная причина? – Venkateshwarrao Surabhi 7 June 2012 в 01:12
  • 3
    @VenkateshwarraoSurabhi Я не получаю эту ошибку - возможно, это означает, что engine имеет значение null. Вы используете Java 1.6+? Нет опечатки в имени двигателя: «JavaScript» с верхним регистром J и S? – assylias 7 June 2012 в 09:01
  • 4
    Спасибо за помощь. Теперь работает. – Venkateshwarrao Surabhi 7 June 2012 в 18:59
  • 5
    Извините, не знал, что я должен щелкнуть чек. Спасибо за помощь. :) – Venkateshwarrao Surabhi 13 July 2012 в 20:49

Для оценки условий с максимальной гибкостью используйте язык сценариев, предназначенный для встраивания, например MVEL может анализировать и оценивать простые условные выражения, подобные тем, которые заданы в вопросе.

Использование MVEL обладает огромным преимуществом по сравнению с использованием механизма Scripting в Java 1.6+ (в частности, с JavaScript): с MVEL вы можете скомпилировать скрипты для байт-кода, делая их оценку намного более эффективной во время выполнения.

0
ответ дан Óscar López 16 August 2018 в 00:04
поделиться

Вы должны попробовать разбор строки внутри оператора if, выполнив что-то вроде

if(parseMyString(getValue()))
    doSomething();

. В parseMyString можно определить, что вам нужно оценить для условия. Если вы не знаете, как создать парсер, посмотрите на: http://www.javapractices.com/topic/TopicAction.do?Id=87

0
ответ дан AGE 16 August 2018 в 00:04
поделиться

Это не отвечает на ваш вопрос сам по себе; он предлагает альтернативное решение, которое может повлиять на тот же результат.

Вместо хранения отдельного столбца базы данных с псевдокодом, который определяет условие, создайте таблицу, в которой схема определяет типы условий, которые должны быть удовлетворены, и значения этих условий. Это упрощает программную оценку этих условий, но может оказаться сложным, если у вас есть множество типов условий для оценки.

Например, у вас может быть таблица, которая выглядит следующим образом.

CONDITION_ID | MINIMUM | MAXIMUM | IS_PRIME  |   ETC.
______________________________________________________
      1      |    2    |   NULL  |   NULL    |   ...
      2      |    4    |    6    |   NULL    |   ...

Эти записи строк, соответственно, соответствуют правилам value > 2 и 6 > value > 4.

Это дает ряд преимуществ по сравнению с вашим подходом.

  • Улучшенная производительность и чистота
  • Ваши условия могут быть оценены на уровне базы данных и могут использоваться для фильтрации запросов
  • . Вам не нужно беспокоиться о том, как обрабатывать сценарии, в которых синтаксис псевдокода
0
ответ дан cheeken 16 August 2018 в 00:04
поделиться

Это не будет тривиально: вам нужен синтаксический анализатор языка выражения, используемого в вашей базе данных. Если это стандартный, хорошо определенный язык, то вы можете найти его в Интернете, но если это внутренняя вещь, вам может понадобиться написать свой собственный (возможно, используя генератор парсера, такой как ANTLR.)

Пакет javax.script содержит некоторые инструменты для интеграции внешних скриптовых движков, таких как Javascript-интерпретатор. Альтернативная идея заключалась бы в создании механизма сценариев и подачи выражений на это.

1
ответ дан Ernest Friedman-Hill 16 August 2018 в 00:04
поделиться
  • 1
    Спасибо за вклад. Да, будут оцениваться только эти типы выражений. – Venkateshwarrao Surabhi 6 June 2012 в 17:10

Последняя версия java (Java 7) позволяет операторам операторов switch в Strings, если вариантов не так много, вы могли бы просто сделать это или подобное:

int value = getValue();
Switch(myString) {
  Case "value > 2" : if (value > 2) {  doSomething();} break;
  Case "4 < value < 6" : if (4 < value < 6) {  doSomethingElse();} break;
  default : doDefault();
}
0
ответ дан NimChimpsky 16 August 2018 в 00:04
поделиться

Очень хороший способ сделать это, помимо использования Java 7, - использовать перечисления. Объявить перечисление, как показано ниже

Вышеприведенное перечисление содержит набор констант, значения которых установлены на строки, которые вы ожидаете, будут возвращены из базы данных. Поскольку вы можете использовать перечисления в случаях переключения, оставшийся код становится легким.

enum MyEnum
{
    val1("value < 4"),val2("4<value<6");
    private String value;

    private MyEnum(String value)
    {
        this.value = value;
    }
}


public static void chooseStrategy(MyEnum enumVal)
{   
    int value = getValue();
    switch(enumVal)
    {
        case val1:
        if(value > 2){}
        break;
        case val2:
        if(4 < value && value < 6) {}
        break;
        default:
    }
}

public static void main(String[] args)
{
    String str = "4<value<6";
    chooseStrategy(MyEnum.valueOf(str));
}

Все, что вам нужно сделать, это передать вашу строку методу enum.valueof и вернуть возвратное перечисление, которое помещается в блок блокировки выключателя для выполнения условного режима. В приведенном выше коде вы можете передать любую строку вместо того, что было передано в этом примере

-3
ответ дан prashant 16 August 2018 в 00:04
поделиться
  • 1
    Я думаю, что голова дяди Боба Мартина просто взорвалась. – Ernest Friedman-Hill 6 June 2012 в 19:08
  • 2
    Некоторая обратная связь, если приветствуется: поскольку OP говорит о том, чтобы вытащить строки из базы данных, ваш метод использует много кода и недостаточно динамичен / достаточно гибким. Если вы не уверены в возможном решении, вам лучше не предлагать это, так как люди будут отклонять ваш ответ. Однако, если вы узнаете из этого вопроса, не стесняйтесь отвечать на подобные вопросы или делиться знаниями. ;-) – siebz0r 6 June 2012 в 22:10
  • 3
    hmm ok Я пропустил точку этих строк, исходящих из db. Дело здесь состояло в том, чтобы показать мощь перечислений на Java и как его можно использовать. Извините, ребята – prashant 7 June 2012 в 13:30

Вы в основном оцениваете скриптовое выражение.

Я предполагаю, что вы смотрите на простой пример, где выражение: [border0] [operator] "value" [operator] [border1]

Если одна, но не обе группы [границы] [оператора], могут быть опущены. (И если оба являются подарками, оператор должен быть тем же самым)

Я бы использовал регулярное выражение для этого с захватными группами.

Что-то вроде: (?: (\ D +) \ s * ([& lt;>]) \ s *)? value (?: \ s * ([& lt;>]) \ s * (\ d +))?

И затем: border1 = group (1); operator1 = группа (2); operator2 = группа (3); border2 = группа (4)

1
ответ дан ptyx 16 August 2018 в 00:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: