2009-12-09 7 views
1

나는 allStates라는 이름의 ArrayList에 값으로 키와 국가 등의 문자와 HashMaps을하다 주 객체를 (넣어합니다.이 HashMap의 equals 및 hashCode 메서드를 구현하여 오토 마톤 상태를 나타내려면 어떻게해야합니까?

이 코드는 자동 기계에 대해 얼마나? 왜? 내가? 여기 equals 메소드와 hashCode 메소드를 오버라이드 (override) 및 주 클래스는 지금까지 구축 한 다음 자동 장치가 DFA 경우

class State extends HashMap<Character, State>{ 

boolean isFinal; 
boolean isInitial; 
int stateId; 

State() { 
    isInitial=false; 
    isFinal = false; 
    } 

public boolean equals (Object o){ 
    boolean isEqual = false; 
    State compare = (State)o; 

    if ((compare.stateId)==this.stateId) 
    { 
     return true; 
    } 
    return isEqual; 
} 

public int hashCode() { 
    int theHashCode = stateId%7; 

    return theHashCode; 
} 


} 

    class Automaton{ 
    List <State> allStates; 
    //private List<State> finalStates; 
    int theInitialStateIntIndex; 
    State actualState; 
     char [] alphabet; 

    Automaton() { 
     allStates = new ArrayList<State>(); 
    } 

    public void setAllStates (int numberOfStates) { 
     for (int i =0; i <numberOfStates; i++) { 
      State newState = new State(); 
      newState.stateId = i; 
      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); 

      theInitialStateIntIndex = initialStateId; 

      /*DEBUG*/ 

      System.out.println("THE INITIAL STATE ID IS " + initialStateId); 

      theInitialState = allStates.get(initialStateId); 
      if ((theInitialState.isInitial)==true) 
      System.out.println("THE STATE " + initialStateId + " 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 int findInitialState(){ 
     int index =0; 

     cycle: for (; index<allStates.size(); index++){ 
      State s = allStates.get(index); 

      if (s.isInitial==true) { 
       break cycle; 
      } 
     } return index; 
} 

    public void processString (String string) 
    { 
     StringBuilder stepString= new StringBuilder (string); 

     int actualStateIntIndex; 
     System.out.println("THE FOUND INITIAL ONE IS "+ theInitialStateIntIndex); 
     State firstState = allStates.get(theInitialStateIntIndex); 
     actualState = firstState; 

     while (stepString.length()>0){ 
      Character characterToProcess = stepString.charAt(0); 
      stepString.deleteCharAt(0); 

      State nextState; 
      nextState = ((State)actualState.get(characterToProcess)); // pasa al siguiente State 
      actualState = nextState; 

      actualStateIntIndex=allStates.indexOf(actualState); 

      System.out.println("the actual state for " + stepString + " is " + actualStateIntIndex); 
      if ((actualState.isFinal==true) && (stepString.length()==0)) 
       { 
        System.out.println("THE STRING " + string + " IS ACCEPTED AT STATE " + actualStateIntIndex); 
       } 
      else if (stepString.length()==0 && (actualState.isFinal==false)){ 
        System.out.println("THE STRING " + string + " IS REJECTED AT STATE " + actualStateIntIndex); 
       } 

      } 
     } 
    } 
+0

죄송합니다. 이해할 수 없습니다 : 어디에서 대체 하시겠습니까? State 객체의 equals() 및 hashCode()의 문제점은 무엇입니까? – lorenzog

답변

0
  1. , 다음 한 ID로 필드를 액세스 문자열을 사용할 수 있습니다
    액세 문자열이 될 수있는 문자열입니다. 시작 상태에서 상태에 도달하는 데 사용됩니다. 하나는 st를 빌드해야합니다. 그러나 DFA를 작성하는 동안 시간 복잡성은 더해지지 않습니다. (예, 그렇다면 해시 코드/문자열과 동일해야합니다.)

  2. 또는 실제로 ID 번호가 늘어나는 일련 번호/문자열은 모든 오토 마톤에서 작동해야합니다. 그런 다음 해시 코드/동일 ID를 기반으로. 당신이 복제 된 상태를 돌봐하지 않으려면

쉽게 2 일, 대한 이동하고, 1보다 더 나은 작동합니다.

예, 사용자 정의 유형이 해시와 함께 작동하려면 해시 코드와 같음이 필요합니다.