我想将一些String
转换为这样的运算符:
int value = 1;
int valueToCompare = 3;
String operation = "<";
if (value operation valueToCompare) {
// some operation
}
如何将变量操作转换为运算符?
答案 0 :(得分:3)
你可以试试这个:
import java.util.*;
interface Operator {
boolean compare(int a, int b);
}
class Launch
{
public static void main (String[] args) throws java.lang.Exception
{
Map<String, Operator> opMap = new HashMap<String, Operator>();
opMap.put(">", new Operator() {
@Override public boolean compare(int a, int b) {
return a > b;
}
});
opMap.put("<", new Operator() {
@Override public boolean compare(int a, int b) {
return a < b;
}
});
opMap.put("==", new Operator() {
@Override public boolean compare(int a, int b) {
return a == b;
}
});
String op = ">";
int i = 4, j = 5;
boolean test = opMap.get(op).compare(i, j);
System.out.printf("test: %b, i: %d, op: %s, j: %d\n", test, i, op, j);
//prints: test: false, i: 4, op: >, j: 5
}
}
答案 1 :(得分:2)
听起来你需要switch based around a string(对于Java 7及更高版本 - 否则简单使用if
/ else
)和一组Comparator对象,例如
switch (operation) {
case ">" : return new GreaterThanComparator();
或
if (operation.equals(">")) {
return new GreaterThanComparator();
}
其中GreaterThanComparator
实现Comparator
接口。您创建的课程实现了您的比较功能,除此之外还可以做更多。它是最接近Java的函数封装。
请注意,上面的Comparator
可以直接在Java集合中使用,以便执行sorting等。
如果要进行大量的比较,可以使用查找表(例如Map
/ String
)或类似的查找表。我认为上面的重要部分是通过Comparators
对象封装行为。
另一种方法是使用Java内置的scripting engine并解析(比如说)Javascript语句。这可能是更多的工作,但肯定是一个更可扩展的解决方案。请注意,您不仅限于Javascript,还存在许多脚本语言,包括Beanshell,Jython等。
答案 2 :(得分:2)
您的方法永远不会在Java中运行。相反,您可以定义自己的enum
,它执行正确的布尔操作,如下所示:
public static void main(String[] args) {
boolean result = Operator.parseOperator("==").apply(2, 2);
}
enum Operator {
LESS("<") {
@Override public boolean apply(int left, int right) {
return left < right;
}
},
EQUAL("==") {
@Override public boolean apply(int left, int right) {
return left == right;
}
};
private final String operator;
private Operator(String operator) {
this.operator = operator;
}
public static Operator parseOperator(String operator) {
for (Operator op : values()) {
if (op.operator.equals(operator)) return op;
}
throw new NoSuchElementException(String.format("Unknown operator [%s]", operator));
}
public abstract boolean apply(int left, int right);
}
答案 3 :(得分:1)
创建一个自定义方法,为您完成..
像这样的东西
private static boolean parseExpression(int number1, String operator, int number2)
{
if ("<".equals(operator)) {
return number1 < number2;
} else if (">".equals(operator)) {
return number1 > number2;
} else if ("<=".equals(operator)) {
return number1 <= number2;
} else if (">=".equals(operator)) {
return number1 >= number2;
} else if ("==".equals(operator)) {
return number1 == number2;
} else {
throw new IllegalArgumentException("Invalid operator");
}
}
private static boolean parseExpression(double number1, String operator, double number2)
{
if ("<".equals(operator)) {
return Double.compare(number1, number2) == -1;
} else if (">".equals(operator)) {
return Double.compare(number1, number2) == 1;
} else if ("<=".equals(operator)) {
return Double.compare(number1, number2) <= 0;
} else if (">=".equals(operator)) {
return Double.compare(number1, number2) >= 0;
} else if ("==".equals(operator)) {
return Double.compare(number1, number2) == 0;
} else if ("!=".equals(operator)) {
return Double.compare(number1, number2) != 0;
} else {
throw new IllegalArgumentException("Invalid operator");
}
}
如果你不想使用比较器,那就是“简单”但应该有效。 对于双/浮动应该做更多的工作
使用Enums的P.S你可以做一些非常优雅的事情。使用Java7,您也可以使用switch-strings
。
答案 4 :(得分:0)
最简单的方法是使用if-else语句链来检查运算符是什么,然后执行数学表达式。
答案 5 :(得分:0)
您可以使用ScriptEngine,也适用于任何其他JavaScript表达式:
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
ScriptEngineManager factory = new ScriptEngineManager();
ScriptEngine engine = factory.getEngineByName("JavaScript");
int value = 1;
int valueToCompare = 3;
String operation = "<";
if ((Boolean)engine.eval("" + value + operation + valueToCompare)) {
System.out.println("Here we are.");
}
答案 6 :(得分:0)
您可以尝试使用开关语句:
switch(operation) {
case "<" : //code here
break;
case ">" : //code here
break;
case "==" : //code here
break;
}
答案 7 :(得分:0)
这不是直接可能的,你必须编写一些代码。一种可能是使用枚举:
enum Operation {
LESS_THAN("<") {
@Override int compare(int o1, int o2) {
return o1 - o2;
}
},
...;
private final String operator;
private Operation(final String operator) {
this.operator = operator;
}
private static final Map<Operation, String> MAP = new HashedMap<Operation, String>();
static {
for (final Operation op: values()) MAP.put(op.operator, op);
}
public static Operation valueOf(final String op) {
return MAP.get(op);
}
}
用法示例:
int cmp = Operation.valueOf(operation).compare(value, valueToCompare);
答案 8 :(得分:0)
<强>答案强>
为了完整性,我想补充说已经存在很多代码。我知道你提出了一个非常具体的问题,但一般的答案是看看现有的解决方案是如何完成的。
示例: