改进Java代码:如果有的话太多了

时间:2010-09-05 17:21:32

标签: java optimization if-statement

我有几个案例,我只使用简单的if ... if else块。

如何减少此代码中if语句的数量?

也许我可以使用查找表,但我不确定如何用Java实现它。

private int transition(char current, int state)
{
    if(state == 0)
    {
        if(current == 'b')
        {
            return 1;
        }
        else 
            return 0;
    }
    if(state == 1)
    {
        if(current == 'a')
        {
            return 2;
        }
        else 
            return 0;
    }
    if(state == 2)
    {
        if(current == 's')
        {
            return 3;
        }
        else 
            return 0;
    }
    if(state == 3)
    {
        if(current == 'e')
        {
            return 3;
        }
        if(current == 'b')
        {
            return 4;
        }
        else 
            return 0;
    }
    if(state == 4)
    {
        if(current == 'a')
        {
            return 5;
        }
        else 
            return 0;
    }
    if(state == 5)
    {
        if(current == 'l')
        {
            return 6;
        }
        else 
            return 0;
    }
    else
        return 0;
}

7 个答案:

答案 0 :(得分:32)

您尝试做的事情看起来非常像有限状态机,这些通常是在转换表的帮助下实现的。设置表后,只需索引到想要获得返回值的位置即可。假设您的返回值都小于256,则可以使用2D字节数组:

byte table[][] = new byte[NUM_STATES][NUM_CHARACTERS];
// Populate the non-zero entries of the table
table[0]['b'] = 1;
table[1]['a'] = 2;
// etc...

private int transition(char current, int state) {
  return table[state][current];
}

答案 1 :(得分:14)

嗯,您可以轻松利用hash。简单干净。

    // declare hashtable
    Map<String, Integer> map = new HashMap<String, Integer>();
    map.put("0-b", 1);
    map.put("1-a", 2);
    map.put("2-s", 3);
    ...

    // get result
    Integer result = map.get(state + "-" + current);
    // change null (nothing found) to zero
    return result == null ? 0 : result;

答案 2 :(得分:9)

考虑接口+枚举:

interface State<T>
{
    public void State<T> step(T input);
}

enum MyState implements State<Character> {
    STATE0(0) { @Override public void MyState step(Character c) { return c == 'b' ? STATE1 : STATE0; }},
    STATE1(1) { @Override public void MyState step(Character c) { return c == 'a' ? STATE2 : STATE0; }},

    /* rest of states here */

    final private int value;
    MyState(int value) { this.value = value; }
    public int getValue() { return this.value; }
}

class SomeClass
{
   public MyState currentState = STATE0;

   public void step(char input)
   {
      this.currentState = this.currentState.step(input);
   }
}

答案 3 :(得分:6)

我在这里切换声明最好:

private int transition(char current, int state)
{
    switch(state)
    {
        case 0:
            return current == 'b' ? 1 : 0;
        case 1:
            return current == 'a' ? 2 : 0;
        case 2:
            return current == 's' ? 3 : 0;
        case 3:
            return current == 'e' ? 3 : (current == 'b' ? 4 : 0);
        case 4:
            return current == 'a' ? 5 : 0;
        case 5:
            return current == 'l' ? 6 : 0;
        default:
            return 0;
    }
}

还有一个注释,只有5个if语句检查纯粹的整数,这不是一个开销。

答案 4 :(得分:5)

看起来你需要为有限状态机提供更好的抽象。想想一个以更好的方式封装你想要的东西的类,这样你就可以通过配置而不是修改代码来扩展它。

答案 5 :(得分:5)

如果此代码即将扩展,为什么不使用状态机呢?每个州将根据收到的角色返回下一个州。也许这对于这段代码来说太过分了,但是维护,扩展和修改它会容易得多。读取。

答案 6 :(得分:2)

对外switch链使用if语句:

switch (state) {
  case 0: <code> ; break;
  case 1: <code> ; break;
  case 2: <code> ; break;
  <etc>
  default: return 0; break;
}