2017-03-28 4 views
-1

はこれを考えますそして米国に)この方法で値を使用する:。のJavaループアルゴリズム

(Events.valueOf(EventsList.get(0)))上(States.valueOf(EventsList.get(0))にトランスそれ(

...

しかし、イテレートするパターンがわからない。

私は本当に助言に感謝します。

が//////////////////////////// UPDATEDありがとう/////////// @Dukelingアドバイス

public Map<States, List<Events>> transitMap; 
    public Map<Events, States> toMap; 

void transitCaller(States initialState, Events events) 
    { 
    transitCallerHelper(on(events).to(initialState),  
    transitMap.get(initialState)); 
    } 

Transition transitCallerHelper(Transition toResult, List<Events> events) 
{ 
    List<Transition> transitCalls = new ArrayList<Transition>(); 
    for (Events e: events) 
    { 
     States s = toMap.get(e); 
     if (isFinishEvent(e)) // or isFinishState(s) 
     transitCalls.add(on(e).finish(s)); 
    else 
    { 
     events = (s != null ? transitMap.get(s) : null); 
     if (events == null) 
     transitCalls.add(on(e).to(s)); 
    else 
     transitCalls.add(transitCallerHelper(on(e).to(s), events)); 
    } 
    } 
return toResult.transit(transitCalls.get(0)); 

}

答えて

0

私の最初の考えに基づいて////////////////////////

ソリューションtransitマッピングとtoマッピングを定義するマップを持つことです:

Map<States, List<Events>> transitMap; 
Map<Events, States> toMap; 

これらのマッピングは、上記のマップを作成できるテキストファイルに保存できます。

あなたのメソッドを呼び出す再帰的な方法で作成することができますここから


fromは異なる型を返すので、それは少し厄介だ)

void transitCaller(State initialState) 
{ 
    from(initialState).transit(getTransitArgs(transitMap.get(ini‌​tialState))); 
} 

Transition transitCallerHelper(Transition toResult, List<Events> events) 
{ 
    return toResult.transit(getTransitArgs(events)); 
} 

Transition[] getTransitArgs(List<Events> events) 
{ 
    List<Transition> transitArgs = new ArrayList<Transition>(); 
    for (Events e: events) 
    { 
     States s = toMap.get(e); 
     if (isFinishEvent(e)) // or isFinishState(s) 
     transitArgs.add(on(e).finish(s)); 
     else 
     { 
     List<Events> events = (s != null ? transitMap.get(s) : null); 
     if (events == null) 
      transitArgs.add(on(e).to(s)); 
     else 
      transitArgs.add(transitCallerHelper(on(e).to(s), events)); 
     } 
    } 
    return transitArgs.toArray(new Transaction[0]); 
} 

(必要に応じてエラーチェックを追加します)


サイドノート:とEventsを複数にするのではなく単数にするとよいでしょう。なぜなら、列挙の各値はそれぞれ単一の状態とイベントしか定義しないからです。

+0

あなたの貴重な答えをありがとう、申し訳ありません私は質問があります: "from"は "on"とfinishの違いがあり、両方とも "Transaction"です。再帰的メソッドを使用する必要があるため、 ? https://pastebin.com/fewi8R0F(デモ):https://github.com/Beh01der/EasyFlow。このコードを申請しようとしています。ありがとう。私は修正を加えましたが、動作しません。変更された/拡張された質問をご覧ください。 – user1069571

+0

上記のコメントを参照してください、ありがとう – user1069571

+0

@ user1069571しかし、それはまた 'トランジット'メソッドを持っていますか?その場合、そのメソッドを両方のクラスに実装する 'interface'に入れることができます。再帰メソッドが気にするのは、 'transit'メソッドしか持たないので、このメソッドを再帰メソッドで' ReturnType'の代わりに使用することができます。または 'transitCallerHelper'メソッドの大部分を' List 'を返す別のメソッド(' getTransitArgs')に移動し、 'from(initialState).transit(getTransitArgs(transitMap.get(initialState)))を実行することもできます。 ; '' transitCaller'の中で。 – Dukeling

関連する問題