繁体   English   中英

如何检查字符串是否包含字符串数组的元素?

[英]How to check if a string contains an element of a string array?

我想检查一个字符串是否包含来自 String 数组的元素。 我认为迭代所有数组元素并查看 String.contains(an element) 是否似乎效率不高。 所以我想知道是否有更有效的方法可以快速查找。

例如,我想从地址字符串中获取国家名称。 用户可以不受任何限制地写下他们的地址。 地址字符串可以包含国家名称或城市名称。 所以我想看看地址字符串是否有一个来自我将构建的数组的元素,该数组有一堆国家名称和城市名称。

我目前的解决方案是:

 ArrayList<String> list;
 String address;
            ...
    for (String s : list) {
        if (address.contains(s))
            return s;
    }

这是 O(n)。 我想知道是否有更快的解决方案。

我假设您没有使用 Guava 或其他带有连接方法的库。 在这种情况下,您可以手动构建正则表达式。

private String regex(String[] names) {
    final StringBuilder b = new StringBuilder();
    String separator = "";
    for (final String name: names) {
        b.append(separator);
        b.append(Pattern.quote(name));
        separator = "|";
    }
    return b.toString();
}

循环和separator变量是连接名称的“no-if”方式。 quote调用确保像$[. 不要把事情搞砸。 如果你的一根弦是“圣路易斯”怎么办?

然后,您使用Matcher.find进行检查。

public boolean contains(String target, String[] names) {
    String regex = regex(names);
    Pattern pattern = Pattern.compile(regex); // Fixed, as per @Java Devil's comment.
    Matcher m = pattern.match(target);
    return m.find();
}

如果要捕获匹配的字符串,请将正则表达式括在括号中,然后返回m.group(1)

如果要检查同一个数组的多个字符串,可以通过预编译匹配数组中所有字符串的正则表达式来提高性能:

Pattern pattern = Pattern.compile(list.stream()
    .map(Pattern::quote)
    .collect(Collectors.joining("|")));

Matcher matcher = pattern.matcher(address);
if (matcher.find()) {
    return matcher.group();
}

虽然这在复杂性方面效率更高,但编译正则表达式会产生一些开销,因此您不太可能看到任何性能提升,除非相同的pattern实例用于许多地址或地址很长并且在列表。

还要注意Pattern.quote的使用,以防字符串包含否则会被正则表达式特殊处理的字符,例如. .

您可以使用 for 循环遍历数组并检查元素是否在字符串中。

检查 String 是否包含某个字符串的更好方法是使用 String 类中的方法,例如 String.contains(char)。 在问一个小问题之前,你应该多做一些实验,或者至少给我们一些可以直接解决的例子。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM