给出2个String值数组,例如:
String[] a1 = {"A", "B", "C"}
String[] a2 = {"A", "B"};
其中一个数组(a1
)包含所有可用的String值而另一个数组(a2
)包含我不想考虑的值,如何返回一个包含a1中未包含的元素的数组在a2
?
约束:
1 GT; a1
和a2
将始终包含唯一有效值,即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();
但我想知道是否有更好的解决方案而不会降低性能
答案 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(List
,Set
,Map
等)而不是数组,那么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));