【问题标题】:Method to check higher precendence of operators, Is there a smarter way to do this?检查运算符的更高优先级的方法,有没有更聪明的方法来做到这一点?
【发布时间】:2013-11-07 15:58:24
【问题描述】:

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

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

【问题讨论】:

  • 如果不需要,为什么要将char 更改为String

标签: java math operators switch-statement


【解决方案1】:

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

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

【讨论】:

  • 是的,我可以选择我自己的值,只要它们以正确的顺序代表优先级,我更喜欢你的方法。谢谢你!
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:
    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;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-13
      • 2017-02-17
      • 1970-01-01
      相关资源
      最近更新 更多