2016-09-16 64 views
0

我需要找到一個ALGO解決這樣的問題: 解決邏輯一個句子內像邏輯算法理解表達IF然後

IF @1 and @2 or @3 or @4 and @5 THEN *STUFF 

請求爲:

0)忘掉「 THEN * STUFF」

1)AND,OR組合可以是任意數字,組合,任何一種串連的

2)還可以是一個簡單的像IF @ 1那麼東西。

3)OR具有優先權,這意味着@ 1和@ 2或3 @總是以任意類型的組合變成IF @ 1和(@ 2或@ 3)。我需要將這種語言轉換爲另一種語言,現在我有像convertSingle(@n),轉換OrGroup(List single),轉換AndGroup(List orGroup)的函數。

5)我完全控制了代碼的這一面,所以只要我可以轉換單個元素並與OR和AND的其餘部分「連接」,我就可以編寫一切。

現在我使用這個解決方案,並相信我的工作,但我覺得不好。這不是優雅,我覺得這是被迫的,我希望做出這個遞歸,但是依靠我自己,現在找不到解決方案。 這是我的算法中大氣壓:

從一般的句子開始,如:IF @ 1 @ 2 @ 3 @ 4 @ 5

  • 它的倒塌,尋找或在正則表達式的方法,併成爲IF#1和#2

  • 節省什麼意思#1,#2(它只是一個或組分組倒塌),因此

1#= @ 1 OR @ 2 OR @ 3

2#= @ 4 OR @ 5

  • 然後尋找AND和最後崩潰後本成爲IF%1然後..

%1 =與門由分組組成要麼。

  • 我需要一個「特殊情況解決方案」簡單一個一樣,如果然後@ 1,不能裝進一個先前溶液..

在最後我有一個工作(用於測試由現在)解決方案。但我不喜歡那樣。我真的不知道爲什麼,但是這個「步驟崩潰」的算法,我覺得這不太好。 但是對我來說,這是我能想到的最好的。

我想知道如果別人聰明的人,那麼我可以建議我一個更好的解決方案。

謝謝。

+0

OR有優先嗎?你確定? – Mshnik

+0

是的,我確定。我可以理解它在「數學方式」中很奇怪,這種自然語言是由詞彙組成的。如果你有與優先級的解決方案,告訴我,這不重要。 –

+0

遞歸地劃分表達式是一個很好的方法。你將基本上構造一個語法樹。你會在葉子上有單個數字。所以也應該有一個由單個數字組成的表達式。 –

回答

0

我想出瞭如何做到這一點。我想爲我的特定解決方案發佈一個解決方案,但也許其他人會像開始點一樣獲取模式。

private ApplyElementDTO recursiveConvertXacmlLogicPart(
     String collapsedlogicapart) throws Exception { 

    /* 
    * 
    * if [email protected] return converted apply 
    */ 
    collapsedlogicapart = collapsedlogicapart.trim(); 
    if (collapsedlogicapart.startsWith("@") 
      && (collapsedlogicapart.length() < 5)) { 
     return getApplyTerm(collapsedlogicapart); // this is just a term to 
                // convert 
    } 

    if (isThisJustanOR(collapsedlogicapart)) { 
     return constructOr(collapsedlogicapart); 

    } 


    // 
    String exp = "((?<=^)|(?<=and\\s)).+?(?:(?=\\sand\\s|$))"; 
    Pattern pattern = Pattern.compile(exp); 

    Matcher matcher = pattern.matcher(collapsedlogicapart); 

    int count = 0; 
    ApplyElementDTO ApplyAND = new ApplyElementDTO(); 

    ApplyAND.setFunctionId(XACMLData.FUNCTION_AND); 

    while (matcher.find()) { 

     String thisAndoperand = matcher.group().trim(); 

     ApplyAND.getApplyElements().add(
       recursiveConvertXacmlLogicPart(thisAndoperand)); 

     count++; 
    } 

    if (count < 2) { 
     throw new Exception(
       "Looklike this was the entire complex rule in recursion," 
         + " but i can't find any suitable operand for AND. " 
         + collapsedlogicapart); 
    } 
    return ApplyAND; 
} 

offcourse constructOr再次調用這個遞歸來轉換單個項。

再見