2017-03-28 10 views
-1

그리고 미국)이 방법으로 값을 사용합니다 :.. (Events.valueOf (EventsList.get (0)))에 (States.valueOf (EventsList.get (0)) 트랜스 그것은 (자바 루프 알고리즘

...

하지만 어떤 패턴이 반복되는지는 확실하지 않습니다.

정말 고맙게 생각합니다.

는 /////////// 당신이

이 //////////////////////////// 업데이트] 감사 @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

내 최초의 생각에 따라 ////////////////////////

솔루션 transitto 매핑을 정의하는지도가 있어야합니다.

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

위 맵을 만들 수있는 텍스트 파일에 이러한 매핑을 저장할 수 있습니다.

는 여기에서 당신은 당신의 방법을 호출하는 재귀 적 방법을 만들 수 있습니다

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]); 
} 

(적절한 오류 검사 추가)


(그것은 조금 지저분한의를 from 반환 다른 종류의 이후부터)

사이드 노트 :및 Events을 복수형과 반대로 단 하나의 값으로 만들 수 있습니다. 열거 형의 각 값은 각각 하나의 상태와 이벤트 만 정의하기 때문입니다.

+0

당신의 소중한 답변을 주셔서 감사합니다, 미안 해요. "from"은 "on"과 finish의 두 가지 유형이 있습니다. 둘 다 "Transaction"입니다. 재귀 적 메소드를 사용해야하므로 아무 것도 실패하지 않습니다. ?. 이 코드는 https://pastebin.com/fewi8R0F (데모)에서 https://github.com/Beh01der/EasyFlow를 신청하십시오. 감사. 수정했는데 작동하지 않습니다. 수정 된/확장 된 질문을 참조하십시오. – user1069571

+0

제발 위의 의견을 참조하십시오, 감사합니다 – user1069571

+0

@ user1069571하지만 그것은 또한'교통 수단을 가지고? 이 경우 두 메소드 모두에서 구현 한'interface' 메소드에 그 메소드를 넣을 수 있습니다. 재귀 적 메소드에서'returnType' 대신이 인터페이스를 사용할 수 있습니다. 왜냐하면 재귀 적 메소드가 'transit' 메소드를 갖는 것이 유일한 방법이기 때문입니다. 또는'transitCallerHelper' 메소드의 대부분을'List '를 반환하는 다른 메소드 ('getTransitArgs')로 옮긴 다음'from (initialState) .transit (getTransitArgs (transitMap.get (initialState)))를 실행합니다. ;에서'transitCaller'. – Dukeling