Il modo più semplice che mi viene in mente è rappresentarlo come un insieme di transizioni e un insieme di stati finali.
Gli stati finali li puoi implementare come un HastSet di interi.
Le transizioni, nella forma (q, ch) -> q' dove q, q' sono stati (interi) e ch è il carattere/simbolo che caratterizza la transizione, puoi implementarli con:
- una classe M che rappresenta lo stato di partenza e il simbolo, ovvero (q, ch);
- un HashMap <M, Integer> che associa a ogni M lo stato di arrivo q'.