Использование 2D Array для переключения состояний без использования Switchcase - PullRequest
0 голосов
/ 19 мая 2019

Я хочу создать бесконечный автомат с разными состояниями, используя два атрибута enum для состояний автомата и ввода. Метод изменения состояния, предоставляемый текущим состоянием и входом, не работает так, как я планировал.

Я понимаю, что мог бы использовать оператор 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 голосов
/ 19 мая 2019

Вы можете использовать 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...