I am working on a finite deterministic automaton based on this .
From this code:
public void markInitialState (int initialStateId) { State theInitialState = allStates.get(initialStateId); theInitialState.isInitial=true; allStates.add(initialStateId, theInitialState); System.out.println(" THE INITIAL STATE ID IS " + initialStateId); theInitialState = allStates.get(initialStateId); if ((theInitialState.isInitial)==true) System.out.println("THE STATE " + theInitialState + " IS MARKED AS INITIAL"); }
I get the line:
THE STATE {d=(this Map), e=(this Map), a=(this Map)} IS MARKED AS INITIAL
In a line that should say:
THE STATE 2 IS MARKED AS INITIAL
Why does Map do this?
I do not understand why it correctly marks final states using the same aproach.
Input file:
4 3 2 1 ab 1 0 2 0 2 0 2 0 3 abaa aab aba 3 3 2 ade 0 1 2 1 2 0 2 1 0 1 2 2 2 a de 3 2 1 ab 1 0 2 0 2 0 2 0 3 abaa aab aba 3 3 2 ade 0 1 2 1 2 0 2 1 0 1 2 2 2 a de
The code:
/* * To change this template, choose Tools | Templates * and open the template in the editor. */ package afd; import java.io.*; import java.util.*; /** * * @author Administrator */ public class Main { /** * @param args the command line arguments */ public static void main(String[] args) throws IOException { // TODO code application logic here FileReader fr = new FileReader("E://Documents and Settings//Administrator//My Documents//NetBeansProjects//AFD//src//afd//dfa.in"); BufferedReader br = new BufferedReader(fr); String firstLine= br.readLine(); String [] firstLineSplitted = firstLine.split(" "); /*debug*/ System.out.println("firstLine is " + firstLine); int numberOfTestCases = Integer.parseInt(firstLine); for (int indexOfTestCases =0; indexOfTestCases < numberOfTestCases; indexOfTestCases++ ){ String caseStartLine = br.readLine(); /*debug*/ System.out.println("caseStarLine is " + caseStartLine); String [] caseStartLineSplitted = caseStartLine.split(" "); int numberOfStates; int numberOfAlphabetSymbols; int numberOfFinalStates; numberOfStates = Integer.parseInt(caseStartLineSplitted[0]); numberOfAlphabetSymbols = Integer.parseInt(caseStartLineSplitted[1]); numberOfFinalStates = Integer.parseInt(caseStartLineSplitted[2]); Automaton automaton = new Automaton(); automaton.setAllStates(numberOfStates); // automaton.size = numberOfStates; // automaton.numberOfAlphabetSymbols = numberOfAlphabetSymbols; // automaton.numberOfFinalStates = numberOfFinalStates; //Automaton a = new Automaton(numberOfStates); String alphabetLine = br.readLine(); System.out.println("alphabetLine is " + alphabetLine); automaton.setAlphabet (alphabetLine); // automaton.alphabetSymbols =new StringBuffer(alphabetLine); for (int indexOfStates = 0; indexOfStates < numberOfStates; indexOfStates++){ String transitionsLine = br.readLine(); /*debug*/ System.out.println("transitionsLine is " + transitionsLine); automaton.setTransitions(indexOfStates,transitionsLine); /*String [] ijLineSplitted = ijLine.split(" "); int i = Integer.parseInt(ijLineSplitted[0]); int j = Integer.parseInt(ijLineSplitted[1]); */ } String finalStatesLine = br.readLine(); /*debug*/ System.out.println("finalStatesLine is " + finalStatesLine); String finalStatesLineSplitted [] = finalStatesLine.split(" "); automaton.markFinalStates(finalStatesLineSplitted); String initialStateAndNumberOfStringsLine = br.readLine(); /*debug*/ System.out.println("initialStateAndNumberOfStringsLine is " +initialStateAndNumberOfStringsLine); String [] splittedInitialStateLine = initialStateAndNumberOfStringsLine.split(" "); int initialState = Integer.parseInt(splittedInitialStateLine[0]); int numberOfStrings = Integer.parseInt(splittedInitialStateLine[1]); automaton.markInitialState(initialState); for (int stringIndex =0; stringIndex<numberOfStrings; stringIndex++){ String stringToProcess = br.readLine(); /*debug*/ System.out.println("stringToProcess is " + stringToProcess); } } } } class State extends HashMap<Character, State>{ boolean isFinal; boolean isInitial; State () { isInitial=false; isFinal = false; } } class Automaton{ List <State> allStates; //private List<State> finalStates; State initialState; State currentState; char [] alphabet; Automaton() { allStates = new ArrayList<State>(); } public void setAllStates (int numberOfStates) { for (int i =0; i <numberOfStates; i++) { State newState = new State(); allStates.add(newState); } } public void setAlphabet (String alphabetLine){ alphabet = alphabetLine.toCharArray(); } public void markFinalStates (String [] finalStates){ for (int index =0; index<finalStates.length; index++) { int aFinalStateId = Integer.parseInt(finalStates[index]); State aFinalState = allStates.get(aFinalStateId); aFinalState.isFinal = true; allStates.add(aFinalStateId, aFinalState); /*DEBUG*/ aFinalState = allStates.get(aFinalStateId); if ((aFinalState.isFinal)==true) System.out.println("THE STATE " + aFinalStateId + " IS MARKED AS FINAL"); } } public void markInitialState (int initialStateId) { State theInitialState = allStates.get(initialStateId); theInitialState.isInitial=true; allStates.add(initialStateId, theInitialState); /*DEBUG*/ System.out.println(" THE INITIAL STATE ID IS " + initialStateId); theInitialState = allStates.get(initialStateId); if ((theInitialState.isInitial)==true) System.out.println("THE STATE " + theInitialState + " IS MARKED AS INITIAL"); } public void setTransitions(int stateId, String transitionsLine){ State theOneToChange = allStates.get(stateId); String [] statesToReachStringSplitted = transitionsLine.split(" "); for (int symbolIndex=0; symbolIndex<statesToReachStringSplitted.length;symbolIndex++){ int reachedState= Integer.parseInt(statesToReachStringSplitted[symbolIndex]); theOneToChange.put(alphabet[symbolIndex],allStates.get(reachedState)); System.out.println("THE STATE " + stateId + " REACHES THE STATE " + reachedState + " WITH THE SYMBOL " + alphabet[symbolIndex]); } allStates.add(stateId, theOneToChange); } public boolean processString (String string) { boolean accepted = false; return accepted; } }
andandandand
source share