将用户估算的比较运算符直接引入 if 语句 (java)



抱歉,如果这是一个简单的问题,我是编码新手,无法在网上任何地方找到答案/找不到正确的措辞方式。

因此,我正在为比较运算符(==,!=,<,<=,>,>=(的用户输入,然后使用它来计算输出。

是否可以将用户输入直接放入 if 语句的比较运算符中?

又名输入用户输入比较,并且有 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 <");
}

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

相反,您应该保留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]);
}
}

是的,你可以从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进行系统控制台交互。这里有一些关于你应该在哪里使用它们的很好的解释。

最新更新