Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
决策表的本机Java解决方案_Java_Rules_Decision Tree - Fatal编程技术网

决策表的本机Java解决方案

决策表的本机Java解决方案,java,rules,decision-tree,Java,Rules,Decision Tree,我正在和一位尊敬的同事进行一次有趣的讨论,并希望得到一些额外的意见 我需要在我的应用程序中实现一些基本的决策表逻辑。我希望使用OpenL平板电脑,它在Excel电子表格中表示决策数据。我喜欢它,它易于设置和维护,内存和处理空间小。我可以很容易地添加新表,我有一些表有超过100行和多达10个条件。这些数据非常静态,很少更改 我的同事不想在混合中引入第三方api,并对绑定到Microsoft文件格式持保留态度 我明白他的意思,但我能看到的通过Java实现决策表的唯一方法是编写一系列难看的if或cas

我正在和一位尊敬的同事进行一次有趣的讨论,并希望得到一些额外的意见

我需要在我的应用程序中实现一些基本的决策表逻辑。我希望使用OpenL平板电脑,它在Excel电子表格中表示决策数据。我喜欢它,它易于设置和维护,内存和处理空间小。我可以很容易地添加新表,我有一些表有超过100行和多达10个条件。这些数据非常静态,很少更改

我的同事不想在混合中引入第三方api,并对绑定到Microsoft文件格式持保留态度

我明白他的意思,但我能看到的通过Java实现决策表的唯一方法是编写一系列难看的if或case语句,这对于较小的表很好,但是当我使用较大的表时,就会变得难以管理

有人对争论的双方都有什么评论吗。如果有人对一种模式有什么想法,可以用原生Java解决我的问题,我很想听听


非常感谢您抽出时间。

嗯,这是一次完全幼稚的尝试:

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; 
                }); 
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; 
}
var规则=新数组();
rules.push(函数(var){
如果(var.getProperty()==0)返回true;
否则返回false;
}); 
rules.push(函数(var){
if(var.getProperty()<1000)返回true;
否则返回false;
}); 
... 更多规则。。。
对于(规则中的var func){
如果(!func(myObject))中断;
}
这将给您比重新编译Java源代码更大的灵活性来更改规则

如果你的应用程序需要高性能,那么在大型表上,这种简单的方法很快就会变慢。例如,在大多数情况下,OpenL平板电脑索引决策表,为任何表大小提供恒定的性能

2) 一旦开始在naive方法的基础上构建,您将看到需要实现不同类型的条件、不同类型的数据解析器等

3) OpenL平板电脑允许您在任何支持Java的平台上使用.xls文件,它只是一种存储格式,库本身就是纯Java。最后,Excel文件是整个世界中最容易转换/导出/导入的文件格式之一


4) 由于切换到最新的ApachePOI库来解析xls和xlsx文件,OpenLTablets运行时依赖项的大小最近有所增加。按照现代标准来看,它仍然是温和的:)

关于MS Excel,它不是唯一可以创建Excel文件的软件,Star/Open/LibreOffice也可以编辑它们。由于决策表和LTables要求的一样简单,所以不应该存在任何兼容性问题


还有其他众所周知的工具将excel用于决策表(阅读JBoss Drools)

哇,谢谢Chris。我想我可以用这个做点什么。。。我要试一试。非常感谢。我高兴地报告,我已经赢得了我的同事。该产品的演示和对上述要点的解释起到了作用。我不太喜欢重新发明轮子,openL平板电脑完美地满足了我的需求。
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");
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; 
}