在Arraylist中查找多个对象的有效方法

时间:2014-05-21 12:43:16

标签: java string arraylist equals contains

我必须检查arraylist是否包含通过对象传递的任何值。

考虑一个值为“abc”,“jkl”,“def”,“ghi”的arraylist。 并String check="abc,ghi"

我们必须检查arraylist中是否存在字符串(abc或ghi)中的任何值,我们可以在找到匹配项时停止检查。

传统上,我们可以使用逗号分割String check并在迭代中使用arraylist.contains()为每个逗号分隔值。

但这很费时间。有没有更好的方法来检查。

3 个答案:

答案 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
    }
}