找到两个字符串数组之间的非常见元素

时间:2014-08-29 14:23:02

标签: java

有一个问题是如何在两个字符串数组之间找到非常见元素。例如:

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中实现这一点

3 个答案:

答案 0 :(得分:4)

这似乎是使用Java的最有效方式。不过,您可以使用addAllremoveAllretainAll

缩短搜索时间
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()的方法,可以完全按照您的意愿执行。