【发布时间】:2013-12-24 05:38:02
【问题描述】:
有什么方法可以检查一个集合是否包含一个或更多的值,并且比使用包含循环两次具有更好的性能?
其他意思是看起来像这样的东西
person.contains("Joe" || "Jasha");
【问题讨论】:
标签: java collections arraylist
有什么方法可以检查一个集合是否包含一个或更多的值,并且比使用包含循环两次具有更好的性能?
其他意思是看起来像这样的东西
person.contains("Joe" || "Jasha");
【问题讨论】:
标签: java collections arraylist
简单地使用数组类
person.containsAll(Arrays.asList("Jasha","Joe"));
【讨论】:
contains 只需要一个参数
if(person.contains("Joe") || person.contains("Jasha")){
// do something
}
如果您担心N 的元素数量
String[] items ={"Joe","jon","And So On".....};
for (String item : items ) {
if (person.contains(item)) {
//found
break;
}
}
编辑:
|| 对您的情况最有帮助,因为您受益于 Short-circuit_evaluation
仅当第一个参数不足以确定表达式的值时,才会执行或计算第二个参数:
【讨论】:
ArrayList.contains() 的实现循环遍历每个元素并进行equals() 测试,因此调用.contains() 两次效率低下。
您可以编写自己的循环,使用已编译的正则表达式 Pattern 同时查找任一名称,同时检查两者:
Pattern p = Pattern.compile("Joe|Jasha");
boolean found = false;
for (String s : person) {
if (p.matcher(s).find()) {
found = true;
break;
}
}
【讨论】:
你也可以像下面这样使用正则表达式:
person.toString().matches(".*\\b(Joe|Jasha)\\b.*");
您将获得一个布尔值,指示它是否存在。
【讨论】:
你也可以这样做
String person1 = "Joe Smith"; // contains "Joe"
String person2 = "Jasha Thompson"; // contains "Jasha"
String person3 = "Jasha Joesephson"; // contains "Joe" and "Jasha"
String person4 = "Steve Smith"; // contains neither
public boolean containsJoeOrJasha(String stringToCheck) {
return !Collections.disjoint(
Arrays.asList(stringToCheck.split(" ")),
Arrays.asList("Joe", "Jasha"));
}
Collections.disjoint 如果两个集合 disjoint 则返回 true,这意味着它们没有共同的元素。所以……
jshell> containsJoeOrJasha(person1)
$33 ==> true
jshell> containsJoeOrJasha(person2)
$34 ==> true
jshell> containsJoeOrJasha(person3)
$35 ==> true
jshell> containsJoeOrJasha(person4)
$36 ==> false
【讨论】:
你必须搜索每个字符串。
更新
List list=new ArrayList();
list.add("Joe");
list.add("Jasha");
if(person.containsAll(list))
{
//do something
}
【讨论】: