Drools新手求助:如何编写规则匹配两个数组?
解决Drools中检查两个类数组相等的问题
嘿,作为刚接触Drools的新手,这个数组匹配的需求其实很好实现,我给你分几种常见场景来写规则,你可以根据自己的实际代码调整:
前提假设
先默认你的两个Java类里有对应的数组/集合属性,比如:
InputFile类有方法public int[] getInputArray()(或者List<Integer>类型的getInputList())OutputFile类有方法public int[] getOutputArray()(或者List<Integer>类型的getOutputList())
场景1:属性是Java数组(如int[])
Java数组直接用==比较的是引用地址,不是内容,所以得用Arrays.equals()来判断内容一致性,规则里要记得导入java.util.Arrays:
import java.util.Arrays; import com.yourpackage.InputFile; import com.yourpackage.OutputFile; rule "Check Arrays Content Equal" when // 从规则引擎工作内存中获取两个类的实例 input: InputFile() // 匹配数组内容完全一致的OutputFile实例 output: OutputFile( Arrays.equals(input.getInputArray(), getOutputArray()) ) then // 数组匹配时执行的业务动作,比如打印日志、修改对象属性等 System.out.println("数组内容完全匹配!Input数组:" + Arrays.toString(input.getInputArray())); // 示例:给OutputFile设置匹配标记,修改后要调用update通知引擎 output.setIsMatched(true); update(output); end
场景2:属性是集合(如List)
如果已经把数组转成了List集合,那就更省心了——List的equals()方法默认会按顺序比较元素内容是否一致:
import com.yourpackage.InputFile; import com.yourpackage.OutputFile; rule "Check Lists Content Equal" when input: InputFile() output: OutputFile( input.getInputList().equals(getOutputList()) ) then System.out.println("List内容完全匹配!Input列表:" + input.getInputList()); // 这里可以添加你的业务逻辑,比如触发后续规则、生成结果文件等 end
额外拓展:忽略元素顺序的匹配
如果需要忽略数组元素的顺序(比如[6,4,8]和[4,6,8]也算匹配),可以先把两个集合排序后再比较:
import java.util.Collections; import java.util.ArrayList; import java.util.List; import com.yourpackage.InputFile; import com.yourpackage.OutputFile; rule "Check Unordered Arrays Equal" when input: InputFile() output: OutputFile() // 通过eval块实现排序后比较的逻辑 eval( { List<Integer> sortedInput = new ArrayList<>(input.getInputList()); List<Integer> sortedOutput = new ArrayList<>(output.getOutputList()); Collections.sort(sortedInput); Collections.sort(sortedOutput); sortedInput.equals(sortedOutput); } ) then System.out.println("数组元素一致(忽略顺序)!"); end
小提醒
- 记得把
com.yourpackage替换成你实际的Java类包名; - 如果数组里存的是自定义对象,一定要确保自定义类重写了
equals()和hashCode()方法,否则会比较对象引用而非内容。
内容的提问来源于stack exchange,提问作者Siddhartha
相关产品推荐
相关产品推荐

