Java 实现类似场景的规则的理想数据结构是什么?
考虑以下场景,其中由ID定义的规则需要满足所有条件 RULES ID Attribute1 Operator1 Value1 Attribute2 Operator2 Value1 ... And so on ------------------------------------------------------------------- 1 x = 10 a IN 5,10 2 x = 20 a IN 10,15 3 x = 20 a IN 25,20 那么ID应该是 1 1 3Java 实现类似场景的规则的理想数据结构是什么?,java,algorithm,data-structures,Java,Algorithm,Data Structures,考虑以下场景,其中由ID定义的规则需要满足所有条件 RULES ID Attribute1 Operator1 Value1 Attribute2 Operator2 Value1 ... And so on ------------------------------------------------------------------- 1 x = 10 a IN 5,10 2
附言:不是作业;只是一些研究。我认为您可以使用SmartParam库()。它是为此类评估而设计的,非常通用,因此即使与属性文件以及数据库一起使用,也可以使用它我认为您可以使用SmartParam库()。它是为此类评估而设计的,非常通用,因此即使与属性文件以及数据库一起使用,也可以使用它我认为您可以使用SmartParam库()。它是为此类评估而设计的,非常通用,因此即使与属性文件以及数据库一起使用,也可以使用它我认为您可以使用SmartParam库()。它是为此类评估而设计的,非常通用,因此即使与属性文件以及数据库一起使用,也可以使用它您是否看过drools之类的规则引擎?比你在这里做的要灵活得多,虽然不一定能解决所有问题。@Taylor是的,但不是很深入。我认为这是一个简单的用例&不要让引擎变得复杂。我很想看到这个用例可以用Drools直接实现。你似乎有一个简单的解释器算法,你可以把它复杂化,但本质是存在的。你的问题/限制是什么?你研究过逻辑编程吗?这是java不擅长的事情,但您的解决方案可以很好地做到这一点。您看过drools这样的规则引擎吗?比你在这里做的要灵活得多,虽然不一定能解决所有问题。@Taylor是的,但不是很深入。我认为这是一个简单的用例&不要让引擎变得复杂。我很想看到这个用例可以用Drools直接实现。你似乎有一个简单的解释器算法,你可以把它复杂化,但本质是存在的。你的问题/限制是什么?你研究过逻辑编程吗?这是java不擅长的事情,但您的解决方案可以很好地做到这一点。您看过drools这样的规则引擎吗?比你在这里做的要灵活得多,虽然不一定能解决所有问题。@Taylor是的,但不是很深入。我认为这是一个简单的用例&不要让引擎变得复杂。我很想看到这个用例可以用Drools直接实现。你似乎有一个简单的解释器算法,你可以把它复杂化,但本质是存在的。你的问题/限制是什么?你研究过逻辑编程吗?这是java不擅长的事情,但您的解决方案可以很好地做到这一点。您看过drools这样的规则引擎吗?比你在这里做的要灵活得多,虽然不一定能解决所有问题。@Taylor是的,但不是很深入。我认为这是一个简单的用例&不要让引擎变得复杂。我很想看到这个用例可以用Drools直接实现。你似乎有一个简单的解释器算法,你可以把它复杂化,但本质是存在的。你的问题/限制是什么?你研究过逻辑编程吗?这是java不擅长的事情,但您的解决方案可以足够好。+1谢谢@JakubK&值得一看。但它看起来是一个单一的贡献者项目;你知道这个项目有一个活跃的社区吗?@gsndev我几周前去过我当地的JG,有2-3个人参与这个项目,还有2家相当大的公司在生产中使用它。+1谢谢@JakubK&值得一看。但它看起来是一个单一的贡献者项目;你知道这个项目有一个活跃的社区吗?@gsndev我几周前去过我当地的JG,有2-3个人参与这个项目,还有2家相当大的公司在生产中使用它。+1谢谢@JakubK&值得一看。但它看起来是一个单一的贡献者项目;你知道这个项目有一个活跃的社区吗?@gsndev我几周前去过我当地的JG,有2-3个人参与这个项目,还有2家相当大的公司在生产中使用它。+1谢谢@JakubK&值得一看。但它看起来是一个单一的贡献者项目;你知道这个项目有一个活跃的社区吗?@gsndev我几周前去过我当地的酒吧,有2-3个人参与这个项目,还有2家相当大的公司在生产中使用它。 1 1 3
public boolean executeRules(List<Criterion> list,
Map<String, String> dataItem) {
boolean fullMatch = true;
if(CollectionUtils.isNotEmpty(list)){
for(Criterion rule : list) {
switch (rule.getOperator()) {
case EQUAL_TO: //Similar to EQUAL TO
if(!rule.getValue().equals(dataItem.get(rule.getOperand()))){
fullMatch = false;
}
break;
case IN://Similar to IN
List<String> inCriteria = null;
if(rule.getValue() != null) {
inCriteria = Arrays.asList(((String) rule.getValue()).split("\\s*,\\s*"));
if(!inCriteria.contains(dataItem.get(rule.getOperand()))){
fullMatch = false;
}
} else {
fullMatch = false;
}
break;
default:
LOG.error("Invalid Operator: " + rule.getOperator());
fullMatch = false;
break;
}
if(!fullMatch) {
return false;
}
}
} else {
LOG.error("No Rules found");
return false;
}
return true;
}