在数组中找到不匹配的元素子集 - java

时间:2012-01-26 17:41:20

标签: java arrays

给出2个String值数组,例如:

String[] a1 = {"A", "B", "C"}  
String[] a2 = {"A", "B"};  

其中一个数组(a1)包含所有可用的String值而另一个数组(a2)包含我不想考虑的值,如何返回一个包含a1中未包含的元素的数组在a2

约束:
1 GT; a1a2将始终包含唯一有效值,即a2中的任何值始终为a1中的值,因此a1之间永远不会存在不匹配}和a2
2 - ; a2可以是空数组

以下是我的想法:

List<String> nonMatch = new ArrayList<String>(a1.length - a2.length);
for (String a : a2)
{
    if (Arrays.binarySearch(a1, a) < 0)
    {
            nonMatch.add(a);
     }
}
return nonMatch.toArray();

但我想知道是否有更好的解决方案而不会降低性能

2 个答案:

答案 0 :(得分:9)

我会使用Set<T> - 可能是HashSet<T>。例如:

Set<String> results = new HashSet<String>(Arrays.asList(a1));
results.removeAll(Arrays.asList(a2));
return results; // Convert to an array if you really must
编辑:我以前的编辑似乎已经迷失了,令人讨厌。

我个人不会转换回数组,除非你有令人信服的理由这样做。如果您坚持使用Java Collection API(ListSetMap等)而不是数组,那么Java中的生活通常会更加愉快。您还应该查看包含许多不错功能的Guava。在这种特殊情况下,它不会很多来改进:

Set<String> results = Sets.newHashSet(a1);
results.removeAll(Arrays.asList(a2));
return results;

...但总的来说,这是一个非常有用的图书馆,可以帮助你。

编辑:要保留订单,请使用LinkedHashSet<T>

Set<String> results = new LinkedHashSet<String>(Arrays.asList(a1));
results.removeAll(Arrays.asList(a2));
return results; // Convert to an array if you really must

答案 1 :(得分:4)

我认为Set可能是最好的方式......

Set<String> diff = new HashSet<String>(Arrays.asList(a1));
diff.removeAll(Arrays.asList(a2));