我必须检查arraylist是否包含通过对象传递的任何值。
考虑一个值为“abc”,“jkl”,“def”,“ghi”的arraylist。
并String check="abc,ghi"
我们必须检查arraylist中是否存在字符串(abc或ghi)中的任何值,我们可以在找到匹配项时停止检查。
传统上,我们可以使用逗号分割String check
并在迭代中使用arraylist.contains()
为每个逗号分隔值。
但这很费时间。有没有更好的方法来检查。
答案 0 :(得分:2)
一种方法是使用retainAll
方法和Set
。
示例强>
// note an additional "ghi" here
List<String> original = new ArrayList<String>(Arrays.asList(new String[]{"abc", "jkl","def", "ghi", "ghi"}));
Set<String> clone = new HashSet<String>(original);
Set<String> control = new HashSet<String>(Arrays.asList(new String[]{"abc","ghi"}));
clone.retainAll(control);
System.out.println(clone.equals(control));
<强>输出强>
true
答案 1 :(得分:0)
您可以将check
转换为正则表达式,只在ArrayList
中循环一次。
String check = "abc,ghi";
Pattern p = Pattern.compile("(" + check.replace(',', '|') + ")");
List<String> list = Arrays.asList(new String[] { "abc", "jkl", "def", "ghi" });
for (String element : list) {
if (p.matcher(element).matches()) {
System.out.println("match: " + element);
}
}
答案 2 :(得分:0)
这仍然是O(n),但您可以从搜索字符串构建一个集合,只需迭代一次列表:
HashSet<String> checks = new HashSet<String>();
checks.addAll(Arrays.asList(check.split(",")));
for (String item : arraylist) {
if (checks.contains(item)) {
// Found one
}
}