有一个问题是如何在两个字符串数组之间找到非常见元素。例如:
String[] a = {"a", "b", "c", "d"};
String[] b = {"b", "c"};
// O/p should be a,d
我尝试了以下方法,但请告知是否有其他有效的方法来实现相同的
String[] a = {"a", "b", "c", "d"};
String[] b = {"b", "c"};
Set<String> set = new HashSet<>(a.length);
for (String s : a) {
set.add(s);
}
for (String s : b) {
set.remove(s);
}
return set;
请告知是否有任何其他有效的方法我们也可以在java中实现这一点
答案 0 :(得分:4)
这似乎是使用Java的最有效方式。不过,您可以使用addAll
,removeAll
和retainAll
String[] a = {"a","b","c","d"};
String[] b = {"b", "c"};
//this is to avoid calling Arrays.asList multiple times
List<String> aL = Arrays.asList(a);
List<String> bL = Arrays.asList(b);
//finding the common element for both
Set<String> common = new HashSet<>(aL);
common.retainAll(bL);
//now, the real uncommon elements
Set<String> uncommon = new HashSet<>(aL);
uncommon.addAll(bL);
uncommon.removeAll(common);
return uncommon;
正在运行示例:http://ideone.com/Fxgshp
答案 1 :(得分:0)
使用Apache Commons Lang3库的ArrayUtils,您可以这样做:
String[] nonCommon = ArrayUtils.addAll(
ArrayUtils.removeElements(a, b),
ArrayUtils.removeElements(b, a));
我不能说它的性能效率,但它 更有效率,因为它是一行代码,你不需要创建和操作集。
此方法也捕获数组b
中的不同元素,如此Groovy测试用例中所示
@Grab('org.apache.commons:commons-lang3:3.3.2')
import org.apache.commons.lang3.ArrayUtils
String[] a = ["a", "b", "c", "d"]
String[] b = ["b", "c", "e"]
assert ["a", "d", "e"] == ArrayUtils.addAll(ArrayUtils.removeElements(a, b), ArrayUtils.removeElements(b, a))
答案 2 :(得分:0)
Apache Commons Collections CollectionUtils
有一个名为disjunction()的方法,可以完全按照您的意愿执行。