我需要找一个算法来解决这类问题: 解决句子中的逻辑,如
IF @1 and @2 or @3 or @4 and @5 THEN *STUFF
请求是:
0)忘了“那个* STUFF”
1)AND,OR组合可以是任何数字,组合,任何类型的连接
2)也可以像IF @ 1 THEN STUFF那样简单。
3)OR具有优先权,这意味着像@ 1和@ 2或3 @总是变成IF @ 1和(@ 2或@ 3),任何组合。
4)我需要将这种语言转换为另一种语言,现在我的功能就像convertSingle(@n),转换OrGroup(List single),转换AndGroup(List orGroup);
5)我完全控制代码的这一面,所以只要我能转换单个元素并与OR和AND的其余部分“连接”,我就可以编写所有内容。
到现在为止,我使用这个解决方案,相信我的工作,但我觉得不太好。它不优雅,我觉得这是强迫的,我希望这个递归,但我自己,现在找不到解决方案。 这是我的算法:
从一般句子开始,例如:IF @ 1或@ 2或@ 3和@ 4或@ 5
它崩溃了,以正则表达式方式寻找OR,它变成了IF#1和#2
保存意味着#1,#2(它只是来自prev的OR组崩溃)所以
1#= @ 1 OR @ 2 OR @ 3
2#= @ 4 OR @ 5
%1 =由prev OR组成的AND。
最后,我有一个工作(现在的测试)解决方案。但我不喜欢这样。我真的不知道为什么,但是这个“逐渐崩溃”的算法,嗯,我觉得这不是很好。 但在我看来,这是我能想到的最好的。
我想知道其他人是否比我聪明,可以建议我寻求更好的解决方案。
谢谢。
答案 0 :(得分:0)
我想出了如何实现这一目标。我想为我的特定解决方案发布一个解决方案,但也许其他人会像开始点那样获得模式。
private ApplyElementDTO recursiveConvertXacmlLogicPart(
String collapsedlogicapart) throws Exception {
/*
*
* if string=@n 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 construct或者再次调用这个递归来转换单个术语。
再见