Принятие вмененного пользователем оператора сравнения непосредственно в оператор if (java) - PullRequest
0 голосов
/ 09 февраля 2020

Извините, если это простая проблема, я новичок в кодировании и не могу найти ответ где-либо в Интернете / не могу найти правильный способ его сформулировать.

Так что я принимаю пользовательский ввод для оператор сравнения (==,! =, <, <=,>,> =) и затем использование его для определения выходных данных.

Можно ли напрямую поместить пользовательский ввод в оператор сравнения оператора if ?

он же вводит userInputComparison и имеет оператор if, работающий?

if(number1 userInputComparison number2) {

}

Есть ли другой способ сделать это?

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

BufferedReader reader =  new BufferedReader(new InputStreamReader(System.in));
String userInput = reader.readLine(); //Should be > or <
int userInputNumber = Integer.parseInt(reader.readLine());
System.out.println("RESULTS");
int[] numbers = {5, 15, 12, 7, 0};
if (userInput.equals(">")) {
   for(int i = 0; i < numbers.length; i++) {
      if(numbers[i] > userInputNumber) {
         System.out.println(numbers[i]);
      }
   }
} else if (userInput.equals("<")) {
   for(int i = 0; i < numbers.length; i++) {
      if(numbers[i] < userInputNumber) {
         System.out.println(numbers[i]);
      }
   }
} else {
   System.out.println("please enter > or <");
}

Ответы [ 2 ]

0 голосов
/ 09 февраля 2020

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

Вместо этого вы должны сохранять свои операторы if, чтобы только >, <, >= и <= разрешены. Внутри циклов for, однако, можно быть извлеченным, поэтому у вас меньше дублирующегося кода.

Вы делаете это, сохраняя оператор в BiPredicate<Integer, Integer>:

BiPredicate<Integer, Integer> operator = (x, y) -> false;
if (userInput.equals(">")) {
   operator = (x, y) -> x > y;
} else if (userInput.equals("<")) {
   operator = (x, y) -> x < y;
} else if

...

} else {
   System.out.println("please enter > or <");
}
for(int i = 0; i < numbers.length; i++) {
   if(operator.test(numbers[i], userInputNumber)) {
      System.out.println(numbers[i]);
   }
}
0 голосов
/ 09 февраля 2020

Да, вы можете использовать ScriptEngineManager с java. Вот пример кода, чтобы показать вам, как его использовать:

public static void main(String[] args) throws ScriptException {
    ScriptEngineManager scriptEngineManager = new ScriptEngineManager();
    ScriptEngine scriptEngine = scriptEngineManager.getEngineByExtension("js");
    Bindings bindings = scriptEngine.createBindings();
    Scanner reader = new Scanner(System.in);

    System.out.println("Please enter operator:");
    String userInput = reader.next();

    System.out.println("Please enter number:");
    int userInputNumber = reader.nextInt();

    int[] numbers = {5, 15, 12, 7, 0};

    String expression = "a" + userInput + "b";
    bindings.put("b", userInputNumber);

    for (int i = 0; i < numbers.length; i++) {
        bindings.put("a", numbers[i]);
        if ((Boolean) scriptEngine.eval(expression, bindings)) {
            System.out.println(numbers[i]);
        }
    }
}

Я предпочитаю использовать Scanner вместо BufferedReader для взаимодействия с системной консолью. Здесь есть несколько хороших объяснений того, где вы должны их использовать.

...