如何在java中将字符串转换为运算符

时间:2014-05-06 11:08:17

标签: java

我想将一些String转换为这样的运算符:

int value = 1;
int valueToCompare = 3;
String operation = "<";

if (value operation valueToCompare) {
    // some operation       
}

如何将变量操作转换为运算符?

9 个答案:

答案 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)

<强>答案

为了完整性,我想补充说已经存在很多代码。我知道你提出了一个非常具体的问题,但一般的答案是看看现有的解决方案是如何完成的。

示例:

Built-in method for evaluating math expressions in Java