使用2D阵列切换状态而不使用Switchcase

时间:2019-05-19 16:28:45

标签: java multidimensional-array

我想使用两个枚举属性为自动机和输入的状态创建具有不同状态的无尽自动机。一种更改当前状态和输入状态的方法无法按我预期的方式工作。

我意识到我可以使用SwitchCase语句,但这会使代码膨胀很多。

我的代码:

public enum state {StandBy, Off, Err, Working};
 public enum input {1, 2};

 private static state changetable [][]
  = {
         {state.Working, state.Off, state.Err, state.Err},
         {state.Err, state.StandBy, state.Err, state.Working}
 };

/* table overwiev
Input| Off, Working, Error, StandBy
1 |    Working, Off, Err, Error
2 |    Error, StandBy, Error, Working  
*/


 public input statchange(state state_now, input inp){
   return changetable[inp.ordinal()][stat_now.ordinal()];
 }

我期望的是: 给定输入,state_now应该更改为新状态。 结果: “要求:输入,找到:状态”

1 个答案:

答案 0 :(得分:0)

您可以使用2张地图

  • 第一个地图将当前状态作为键,并将所有下一个状态作为值(它将是第二个地图)
  • 第二张地图将输入作为键,并将输入的状态作为值
    public enum State {StandBy, Off, Err, Working};
    public enum Input {ONE, TWO};

    public static Map<Input, State> createStandByNextStates() {
        Map<Input, State> nextStates = new HashMap<>();

        nextStates.put(Input.ONE, State.Off);
        nextStates.put(Input.TWO, State.StandBy);

        return nextStates;
    }

    public static void main(String[] args) throws IOException {
        // Map<Current state, Map<input, next state>>
        Map<State, Map<Input, State>> changetable = new HashMap<>();

        changetable.put(State.StandBy, createStandByNextStates());

        System.out.println(changetable.get(State.StandBy).get(Input.ONE));
        System.out.println(changetable.get(State.StandBy).get(Input.TWO));
    }

输出:

Off
StandBy