-1

このコードを正しく動作させるのに少し苦労しています。1 行のファイルを取得し、グラフを移動して、特定の入力番号の各状態を出力することになっています。 ここに画像の説明を入力

サンプル ファイルは次のようになります。1; 0; 1; 1; 0; 1

出力は次のようになります。

入力 = 1; 状態 = ArraySet[開始]

入力 = 0; 状態 = ArraySet[開始、近い]

入力 = 1; 状態 = ArraySet[開始、終了]

入力 = 1; 状態 = ArraySet[開始]

入力 = 0; 状態 = ArraySet[開始、近い]

入力 = 1; 状態 = ArraySet[開始、終了]

以下のコードを完成させました。

public class NDFA {

  public static void main(String[] args) {

  Map<String, Map<String,Set<String>>> mainMap = new ArrayMap<String, Map<String,Set<String>>>();

  TypedBufferReader input = new TypedBufferReader("Enter Non-Deterministic Finite Automaton Description File: ");


  for (;;) {
     try {
          String line = input.readLine();
          StringTokenizer st = new StringTokenizer(line, ";");
          String  state = st.nextToken();

          Map<String,Set<String>> transitions = mainMap.get(state);

          transitions = new ArrayMap<String, Set<String>>();
          Set<String> stateSet = new ArraySet<String>();

          while (st.hasMoreTokens()) {
              String intStateInput = st.nextToken();
              String inputState = st.nextToken();
              stateSet.add(inputState);
              transitions.put(intStateInput, stateSet);
          }
        mainMap.put(state, transitions);
     } catch (EOFException e) { break;}
  }

//sort
List<String> mapList = new ArrayList<String>(mainMap.keys());
Collections.sort(mapList);
System.out.println("Non-Deterministic Finite Automaton");
for (String s : mapList) {
    Map<String, Set<String>> tempMap = mainMap.get(s);
    System.out.println(s + " transitions = " + tempMap.toString());
}

//Process one line file.
  TypedBufferReader oneLineInput = new TypedBufferReader("Enter start state/inputs file: ");

  try {
      String oneLine = oneLineInput.readLine();
      StringTokenizer st = new StringTokenizer(oneLine,";");
      String currentState = st.nextToken();
      System.out.println("Initial state = " + currentState);
      String inputNum = "";

      Set<String> inputSet;

             //stuck while storing inputNums in a set.
      while (st.hasMoreTokens()) {
          inputNum = st.nextToken();
          inputSet.add(inputNum);
          Map<String,Set<String>> transitions = mainMap.get(currentState);
          currentState = transitions.get(inputSet.values());
          System.out.println("input = " + inputNum + "; new state = " + currentState) ;
      }
      System.out.println("Final state = " + currentState);
  } catch (EOFException e) {}

  }

}

現在の状態から正しいセットを出力できません。入力数値は簡単に確認できますが、最初から最後まで進むと混乱し、正しい ArraySet を出力できません。

4

1 に答える 1

1

私はPythonで以前に似たようなことをしました。これがあなたのJavaに役立つかどうかはわかりません。

>>> g = {}
>>> g['start'] = {1: ['start'], 0: ['start', 'near']}
>>> g['near'] = {1: ['end']}
>>> g['end'] = {}
>>> data = [1, 0, 1, 1, 0, 1]
>>> states = ['start']
>>> while data:
...     x = data.pop(0)
...     new_states = []
...     for s in states:
...         reach = g[s]
...         if x in reach:
...             new_states += reach[x]
...     states = list(set(new_states))
...     print states
...
['start', 'near']
['start', 'end']
['start']
['start', 'near']
['start', 'end']
于 2012-10-11T21:28:19.970 に答える