You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 03:47:49