Да, я не совсем понимаю, зачем вообще нужна коллекция.
Для простого конечного автомата вы можете просто использовать статические целые числа и оператор case, чтобы сделать свой конечный автомат следующим образом:
int STATE1 = 1;
int STATE2 = 2;
int STATE3 = 3;
int STATE4 = 4;
int currentstate = STATE1 ;
int input = nextInput();
while(currentstate != STATE4 ){
switch(input){
case STATE1:
if(input == 'a') currentstate = STATE2;
break;
case STATE2:
if(input == 'b') currentstate = STATE3;
else currentstate = STATE1;
break;
case STATE3:
if(input == 'c') currentstate = STATE4;
else currentstate = STATE1;
}
}
Это базовый конечный автомат, который будет искать любую строку, содержащую «abc». Вы можете легко расширить это тоже искать ab * c или все, что вы хотите.
Так что, если вам нужен динамический конечный автомат, созданный во время выполнения? Ну, я тоже это сделал. Это не так уж сложно. Что я сделал, так это создал класс состояний со списком переходов. Каждый переход имеет указатель на следующее состояние и критерии для ссылки.
Так, например, STATE1 будет иметь переход с критериями «a» и указатель на некоторый объект, который представляет STATE2. Код будет проверять критерии (это может быть объект, который принимает int в качестве параметра и возвращает true или false, если он соответствует), и если критерии совпадают, он будет перемещать указатель состояния в состояние, указанное переходом.
Код может выглядеть примерно так:
</p>
<pre><code>public void move(int input){
for(transition t : currentState.transitions){
if(t.getCriteria().matches(input)){
currentState = t.getNextState();
break;
}
}
}