最近实现了一个挺有意思的功能。这里来记录一下。
需求:根据用户条件筛选出可用数据。
比如,有几条个人信息的数据,A用户想看到的数据是男性用户,B用户想看到的数女性用户,C用户想看到的是年龄大于30的女性用户,等等、、、
一开始的想法是,为每个用户对应个人信息字段添加一个标示或者多个标示,作为过滤条件。
貌似可以满足需求,等等,以上的每个用户的判断条件之间都是·与·的关系,如果是·或·的关系怎么办,比如用户想看到的数据是大于30岁的男性或者小于20岁的女性:
用多条数据来标示·或·的关系,貌似也可以。但是如果用户想看到的数据是大于30岁的男性与居住于北京小于40岁的女性或者小于20岁的女性(当然前面与的结果是空,但是不妨碍会有这种需求啊,变态有的是),这种方式就没办法满足了,冥思苦想没有解决方案,同事建议可以看看后缀表达式,一看果然是好东西,这个条件可以表达成为:
这个可读性好像比较差,用逗号隔开吧:
可以加上括号看看逻辑:
啊,就是这样吧,之所以用后缀表达式,是为了便于解析,我们只要从左到右依次遍历表达式,做入栈和出栈操作就可以得到结果了。不废话,直接上代码呗(伪代码不要介意):
就完成了。。
哈哈红红火火恍恍惚惚。。好吧其实这个描述太简陋了,实际实现还是要复杂一些的,比如类型判断啊,还要支持阈值的判断,需求饶过谁啊。直接放源码,欢迎批评指正:
支持的操作:
大于 >
小于 <
等于 ==
与 &&
或 ||
不等于 !=
包含 contain
不包含 !contain
阈值(实际操作是与,并且返回是否符合阈值判断) @