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

Posted

技术标签:

【中文标题】Java - 如何检查字符串是不是包含字符串数组的元素?【英文标题】:Java - how to check if a string contains an element of a string array?Java - 如何检查字符串是否包含字符串数组的元素? 【发布时间】:2013-10-03 03:47:14 【问题描述】:

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

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

我目前的解决方案是:

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

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

谢谢。

【问题讨论】:

你有示例代码吗? 除非元素数组非常长,否则我只会迭代。您也可以构建一个“动态”正则表达式Pattern,但这似乎比它值得做的工作更多。 如果他能存储模式,使用一个会更好。 代码运行速度是否太慢,无法满足您的要求? “过早的优化是万恶之源。-- Knuth 【参考方案1】:

我假设您没有使用 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 变量是连接名称的“否”方式。 quote 调用确保$[. 等字符不会搞砸。如果你的一根弦是“St. Louis”呢?

然后,您使用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)

【讨论】:

我很想知道这与数组循环和使用contains... 也很好奇,我认为这会更糟,考虑到这无论如何都会循环数组,但会增加 StringBuilder 的开销。我也不知道Pattern.compile(); 接受了String[] 对不起——它没有。我将编辑以在模式中使用regex【参考方案2】:

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

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

【讨论】:

他正在寻找比@Hatori 检查他的帖子更有效的东西 还有一个关键是要安排好你的代码,这样你就可以在找到需要的信息后尽快破解。 @Prateek 我认为这一点是你不应该尝试优化不需要优化的代码。

以上是关于Java - 如何检查字符串是不是包含字符串数组的元素?的主要内容,如果未能解决你的问题,请参考以下文章

如何检查数组列表是不是包含特定的字符串值? [复制]

用于检查 char 数组是不是包含 Java 中用户给定字母的 if 语句

如何检查字符串是不是包含数组中的任何元素[关闭]

如何检查一个字符串数组是不是包含 JavaScript 中的一个字符串? [复制]

如何检查字符串是不是包含在数组中?不和谐.js

如何检查字符串是不是包含 JavaScript 预定义数组中存在的子字符串?