我想计算来自expList的textToBeTested数组中单词的存在。

请注意,expList和textToBeTested数组都可能非常大。

我可以简单地遍历两个列表并使用“.matches”方法进行计数,但是它在O(n ^ 2)中。

我可以使用更快的算法或实现吗?

    String[] expList = {"i", "i'd", "i'll", "i'm", "i'm", "bet[a-zA-Z]*", "my[a-zA-Z]*"};
    String[] textToBeTested = {"this", "is", "better", "than", "my", "method"};

例如在上面的textToBeTested数组中,“更好”和“我”与expList数组中的字符串匹配,因此它将返回2。

非常感谢您的帮助。

最佳答案

将您所有的模式编译为使用轮换的更大模式呢?如果将变更正确编译到状态机中,则变更可以很快(例如Aho Corasick或KMP)。

boolean first = true;
StringBuilder sb = new StringBuilder();
for (String s : expList) {
    sp.append("(?:").append(Pattern.quote(s)).append(')');
    if (!first) {
        sb.append('|');
    }
    first = false;
}

Pattern pattern = Pattern.compile(sb.toString());

// Possibly make this a ForkJoinTask
int count = 0;
for (String s : textToBeTested) {
    if (pattern.matcher(s).matches()) {
        count++;
    }
}

09-12 12:35