【问题标题】:Taking a user imputed comparison operator directly into if statement (java)将用户推算比较运算符直接带入 if 语句(java)
【发布时间】:2020-02-09 07:25:37
【问题描述】:

对不起,如果这是一个简单的问题,我是编码新手,在网上的任何地方都找不到答案/找不到正确的表达方式。

所以我为比较运算符(==、!=、、>=)接收用户输入,然后使用它来计算输出。

是否可以将用户输入直接放入 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 <");
}

【问题讨论】:

    标签: java compare comparison


    【解决方案1】:

    直接将用户输入片段注入源代码并让它运行是非常糟糕。这意味着用户现在可以在您的计算机上运行任何代码,这是一个很大的安全风险。

    相反,您应该保留您的 if 语句,以便只允许使用 &gt;&lt;&gt;=&lt;=。不过里面的 for 循环,可以抽出来,所以重复的代码少了。

    您可以通过将运算符存储在 BiPredicate&lt;Integer, Integer&gt; 中来做到这一点:

    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]);
       }
    }
    

    【讨论】:

    • 一件小事:BiFunction 需要 3 个参数(前 2 个用于 x,y,一个用于结果)和 operator.apply(x,y)。如果您想使用operator.test(),我假设正确的接口应该是BiPredicate
    • 不应该是BiFunction&lt;Integer,Integer,Boolean&gt; 还是BiPredicate&lt;Integer,Integer&gt;
    【解决方案2】:

    是的,您可以使用 java 中的 ScriptEngineManager。这是一个示例代码,向您展示如何使用它:

    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 进行系统控制台交互。 Here 很好地解释了您应该在哪里使用它们。

    【讨论】:

      猜你喜欢
      • 2022-01-09
      • 1970-01-01
      • 2017-01-03
      • 2013-03-07
      • 1970-01-01
      • 2012-05-30
      • 2018-11-10
      • 1970-01-01
      • 2021-11-21
      相关资源
      最近更新 更多