我想做的是检查字符串是否包含String数组中的元素。我认为迭代所有数组元素并查看String.contains(一个元素)是否效率似乎不高。所以我想知道是否有更有效的方法来快速查找。
例如,我想从地址字符串中获取国家/地区名称。用户可以无任何限制地编写他们的地址。地址字符串可以包含国家/地区名称或城市名称。所以我想看看地址字符串是否有一个我将构建的数组中的元素有一堆国家名称和城市名称。
我目前的解决方案是:
ArrayList<String> list;
String address;
...
for (String s : list) {
if (address.contains(s))
return s;
}
这是O(n)。我想知道是否有更快的解决方案。
谢谢。
答案 0 :(得分:0)
我假设你没有使用带有连接方法的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
调用可确保$
,[
或.
等字符不会混乱。如果你的一个字符串是“圣路易斯”怎么办?
然后,您使用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)
。
答案 1 :(得分:-1)
您可以使用for循环遍历数组并检查元素是否在String中。
检查String是否包含某个字符串的更好方法是使用String类中的方法,例如String.contains(char)。在提出一个微不足道的问题之前,你应该做一些更多的实验,或者至少给我们一些可以直接解决的例子。