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

如何根据违禁词列表过滤流数据,同时支持例外列表的豁免规则

问题需求
  • 违禁词基准列表:{"South", "East", "West", "North"}
  • 输入数据流示例:{"South", "North korea", "East", "South carolina", "West", "North"}
  • 豁免例外列表:{"South korea", "North korea"}
  • 过滤规则:
    1. 默认移除所有包含任意违禁词的输入项
    2. 豁免规则:完全属于例外列表的项可保留,即使包含违禁词
    3. 性能要求:例外列表数据量大,禁止遍历校验,需O(1)查询效率
    4. 最终保留项:属于例外列表的项 + 本身不含任何违禁词的项
  • 示例预期输出:{"North korea"}

错误逻辑分析

原有代码判断逻辑完全不符合需求:同时要求输入项既不包含任何违禁词,也不包含任何例外列表项,和要求的保留规则完全相反;且每次判断都全量遍历例外列表,性能不符合要求。


正确实现方案

预处理优化

提前将例外列表转换为HashSet,实现O(1)时间复杂度的精确匹配查询,完全避免遍历例外列表:

// 预处理步骤仅执行一次,不要放到流的过滤逻辑中重复生成
Set<String> exemptionSet = new HashSet<>(Arrays.asList(excludedFromIllegalWordsList));
List<String> illegalWords = Arrays.asList(illegalWordList);

过滤逻辑调整

每个输入项只要满足以下两个条件之一即可保留:

return exemptionSet.contains(word) || illegalWords.stream().noneMatch(word::contains);

完整运行示例

import java.util.*;
import java.util.stream.Collectors;

public class IllegalWordFilter {
    public static void main(String[] args) {
        // 模拟输入数据
        List<String> input = Arrays.asList("South", "North korea", "East", "South carolina", "West", "North");
        // 预处理集合
        Set<String> exemptionSet = new HashSet<>(Arrays.asList("South korea", "North korea"));
        List<String> illegalWords = Arrays.asList("South", "East", "West", "North");
        // 执行过滤
        List<String> result = input.stream()
                .filter(word -> exemptionSet.contains(word) || illegalWords.stream().noneMatch(word::contains))
                .collect(Collectors.toList());
        // 输出结果:[North korea]
        System.out.println(result);
    }
}

可选优化提示

如果违禁词列表量级也很大,可以替换为AC自动机实现多模式匹配,进一步提升违禁词包含校验的效率。

内容的提问来源于stack exchange,提问作者dushkin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 20:09:04