我正在寻找解析一些用户输入的方法。输入应显示必须执行的搜索以及必须如何组合。
第一个例子应该以AND方式组合搜索1和2的结果。第二个例子应该以AND方式组合搜索3和2的结果,并以OR方式将该组合的结果组合到搜索1的结果中。等
关于如何做到这一点的任何想法?
答案 0 :(得分:2)
将您的“结果”视为一个对象,它在以下界面中提供和/或类似的方法:
public interface AndOrCapable<T> {
public T and(T anOtherResult);
public T or(T anOtherResult);
}
然后,您可以将用户输入转换为:
Result total = r2.or(r1.and(r3.or(r4))); // your fourth example
这只是为了澄清这个概念 - 在你的情况下,你需要一个动态评估器,因为你使用了用户输入。
因此,您仍然需要验证器/解析器将用户输入转换为(语法)树,这将是您用来计算总计的模型。
希望它有所帮助!
答案 1 :(得分:2)
JavaCC是一个很好的工具,用于为此生成解析器。或者,如果您可以稍微更改语法,则可以使用方案解释器使用java编写脚本工具,例如。
( (3 OR 4) AND 1) OR 2
变为
(OR (AND (OR 3 4) 1) 2)
然后你只需要实现AND / OR
答案 2 :(得分:1)
关于如何为通用关键字搜索创建解析器的一些灵感......
即使你标记了问题 java ,这里也是python中searchparser的一个例子。它使用pyparsing,一个解析器生成器,它接受语法并创建代码,可以运行解析器用户输入。
https://github.com/pyparsing/pyparsing/blob/master/examples/searchparser.py
293行代码,包括测试套件。也许它可以帮助你作为一个起点......
答案 3 :(得分:1)
干净的解决方案是编写中缀解析器;网上有很多代码示例。在您的示例中,更简单的算法可能就足够了,因为您不需要运算符优先级等。
作为编码注释:StreamTokenizer
类可以帮助您解析输入字符串。
答案 4 :(得分:1)
在实现端(一旦你有一个解析器,组织和执行搜索):
如何创建Condition
树,其中Condition
个对象可能是简单条件,或复合条件将两个简单条件与一个布尔(IE ANDCondition
父节点与子节点连接起来RangeCondition
和EqualsCondition
)。
然后根据每个项目评估树的顶部。此解决方案是O(mn),其中m是条件数,n是要搜索的项目数,但您可以通过删除冗余条件来优化此项。如果第一个条件消除了大多数项目,它会快得多。
版本2:为每个项目(例如,数组索引)分配唯一键,并对每个条件执行搜索,为每个条件构建HashSet<Key>
。然后,从最小的必需键开始,删除或添加每个条件的键,直到获得最终结果。这可能比上述更快,具体取决于。
注意:这些方法模仿SQL数据库的运行方式 - 如果您的系统足够大或复杂,您应该调查使用数据库而不是编写自己的代码来执行相同的操作。