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

nam*_*ked 2 java arrays

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

String[] a1 = {"A", "B", "C"}  
String[] a2 = {"A", "B"};  
Run Code Online (Sandbox Code Playgroud)

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

约束:
1> a1并且a2将始终包含唯一的有效值,即任何值a2将始终是一个值a1,因此永远不会有不匹配a1a2)
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();
Run Code Online (Sandbox Code Playgroud)

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

Jon*_*eet 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
Run Code Online (Sandbox Code Playgroud)

编辑:我以前的编辑似乎已经迷失了,令人讨厌.

除非你有令人信服的理由,否则我个人不会转换回阵列.寿命一般在Java中更愉快,如果你坚持到Java收集API( ,,List 等),而不是阵列.您还应该看看包含许多不错功能的Guava.在这种特殊情况下,改善事情并没有太大作用:SetMap

Set<String> results = Sets.newHashSet(a1);
results.removeAll(Arrays.asList(a2));
return results;
Run Code Online (Sandbox Code Playgroud)

...但总的来说,这是一个非常有用的图书馆.

编辑:要保留订单,请使用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
Run Code Online (Sandbox Code Playgroud)