检查运算符的更高优先级的方法,有更聪明的方法吗?

时间:2013-11-07 15:58:25

标签: java math operators switch-statement

这是我写的一个方法,用于检查哪个运算符具有最高优先级,现在我的问题是:有没有其他方法可以执行此操作?我一直在测试这个,它工作正常,但我很确定应该有改进的余地。你觉得怎么样?

static boolean hasHigherPrecendence(char top, char current){

    String t = String.valueOf(top);
    String c = String.valueOf(current);

    System.out.println(t);
    System.out.println(c);

    switch (t) {
    case "-":
        if ( c.equals("-") || c.equals("+") )
            return false;
        break;      
    case "+":
        if ( c.equals("-") || c.equals("+") )
            return false;
        break;          
    case "/":
        if ( !c.equals("*") || !c.equals(t) || !c.equals("%") )
            return false;
        break;      
    case "*":
        if ( !c.equals("%") || !c.equals(t) || !c.equals("/"))
            return false;
        break;
    case "%":
        if (c.equals(t) || c.equals("*") || c.equals("/"))
            return false;
        break;          
    default:
        throw new IllegalArgumentException("Operator unknown: " + t);
    }       

    return true;
}

3 个答案:

答案 0 :(得分:4)

如果是我,我会在一个函数中对运算符进行排名(注意,我选择的值不一定是您应该使用的值...):

private static final int rankOperator(char op) {
    switch (op) {
        case '-' : return 0;
        case '+' : return 0;
        case '/' : return 2;
        case '*' : return 2;
        case '%' : return 4;
    }
    throw new IllegalStateException("Unknown operator " + op);
}


public boolean hasHigherPrecedence(char top, char current) {
    return rankOperator(top) > rankOperator(current);
}

答案 1 :(得分:1)

static boolean hasHigherPrecendence(char top, char current){
    Map<Character,Integer> map = new HashMap<>();
    map.put('+',new Integer(1));
    map.put('-',new Integer(1));
    map.put('*',new Integer(2));
    map.put('/',new Integer(2));
    map.put('%',new Integer(3));
    if( map.get(top)==null ){
        throw new IllegalArgumentException("Operator unknown: " + top);
    }
    if( map.get(current)==null ){
        throw new IllegalArgumentException("Operator unknown: " + current);
    }
    if(map.get(t) >= map.get(c)){
        return true;
    }else{
        return false;
    }
}

答案 2 :(得分:1)

除了使用地图,数组,函数......你可以使用相同的行为连接案例来减少你的代码:

static boolean hasHigherPrecendence(char top, char current){

    String t = String.valueOf(top);
    String c = String.valueOf(current);

    System.out.println(t);
    System.out.println(c);

    switch (t) {
    case "-":
    case "+": 
        if ( c.equals("-") || c.equals("+") )
            return false;
        break;              
    case "/": 
    case "*":
    case "%":
        if (c.equals("%") || c.equals("*") || c.equals("/"))
            return false;
        break;          
    default:
        throw new IllegalArgumentException("Operator unknown: " + t);
    }       

    return true;
}