决策表的本机Java解决方案

Elw*_*ood 7 java rules decision-tree

我正在与一位受人尊敬的同事讨论一个有趣的讨论,并希望得到一些额外的意见......

我需要在我的应用程序中实现一些基本的决策表逻辑.我当时希望使用OpenL Tablets来表示Excel电子表格中的决策数据.我喜欢它,它易于设置和维护,并且具有较小的内存和处理空间.我可以轻松添加新表,我有一些表超过100行,最多10个条件.这些数据非常静态,很少发生变化.

我的同事不希望在混合中引入第三方API,并对与Microsoft文件格式绑定有所保留.

我看到他的观点,但我能看到通过Java实现决策表的唯一方法是编写一系列丑陋的if或case语句,这对于较小的表来说很好,但是当我到达更大的表时会变得难以管理.

有没有人对论点的双方都有任何评论.如果有人对可以解决我在本机Java中的问题的模式有任何想法,我会有兴趣听到它.

非常感谢你的时间.

Chr*_*s K 8

嗯,一个完全天真的尝试:

public interface Condition<Type T> {
    public boolean process(T object); 
} 

ArrayList row = new ArrayList<Condition>(10); 
row.add( new Condition<YourObject>() { 
                public boolean process(YourObject obj) { 
                       if ( obj.property > 0 ) return true; 
                       else return false; 
                }); 
row.add( new Condition<YourObject>() { 
                public boolean process(YourObject obj) { 
                       if ( obj.property2 == 100 ) return true; 
                       else return false; 
                }); 
Run Code Online (Sandbox Code Playgroud)

然后你会迭代:

for ( Condition<YourObject> cond : row ) {
    if ( ! cond.process(yourobj) ) break; 
}
Run Code Online (Sandbox Code Playgroud)

一个稍微复杂的例子,您可以更简洁地在javascript中编写决策表,并且可能使用Beanshell来执行逻辑.在我给你发一个例子之前,我必须打一个贝壳然后敲打一下.

或者你可以发布一个例子,有人可以想出一些简单的Scala例程来做你想做的事情.

编辑:

所以我做了一些研究和思考,对于Beanshell你可以使用类似的东西:

import bsh.Interpreter;

Interpreter i = new Interpreter();  // Construct an interpreter
YourObject yourObject = new YourObject();
i.set("myObject", yourObject ); 

// Source an external script file
i.source("somefile.bsh");
Run Code Online (Sandbox Code Playgroud)

somefile.bsh可能如下所示:

var rules = new Array(); 
rules.push( function(var) { 
             if ( var.getProperty() == 0 ) return true; 
             else return false; 
          }); 
rules.push( function(var) { 
             if ( var.getProperty() < 1000 ) return true; 
             else return false; 
          }); 
... more rules ... 

for ( var func in rules ) { 
    if ( !func( myObject ) ) break; 
}
Run Code Online (Sandbox Code Playgroud)

与重新编译Java源代码相比,这将使您更灵活地更改规则.

您必须向这些解决方案中的任何一个添加另一个阵列才能获得100个源"行"