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

nds*_*sfd 6 java collections set

在一次采访中,人们被要求在两个字符串数组之间找到非常见的元素.

Eg: String a[]={"a","b","c","d"}; 
String b[]={"b","c"}; 
O/p should be a,d
Run Code Online (Sandbox Code Playgroud)

我回答了Java Set中使用HashTable实现的问题.使用Set的代码更简单:

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;
Run Code Online (Sandbox Code Playgroud)

现在我的问题是,有没有其他更好的方法来实现这一目标

aio*_*obe 6

如果[x,y], [x,z]应该[y,z]在这里得到我的建议:

String[] a = {"a","b","c","d"};
String[] b = {"b", "c", "x"};

Set<String> set = new HashSet<>(Arrays.asList(a));
for (String s : new HashSet<>(Arrays.asList(b)) {
    if (!set.add(s))    // if it's already present
        set.remove(s);  // remove it from the result
}
Run Code Online (Sandbox Code Playgroud)

另一方面,[x,y], [x,z]如果屈服[y],我会建议

Set<String> set = new HashSet<>(Arrays.asList(a));
set.removeAll(Arrays.asList(b));
Run Code Online (Sandbox Code Playgroud)

  • 非常聪明.这是一个非常好的答案. (2认同)

sin*_*ash 6

您可以缩短代码

TreeSet set = new TreeSet(Arrays.asList(a));
set.removeAll(Arrays.asList(b));
Run Code Online (Sandbox Code Playgroud)

演示

  • @SaurabhJhunjhunwala怎么一套可以复制? (2认同)
  • 如何重复相关,@ SaurabhJhunjhunwala?任务是找到非共同的元素.这种方法非常有效. (2认同)

Mak*_*oto 5

实际上,这扩展了Jon Skeet的答案,但使用Java 8的流程.

String[] result = Arrays.stream(a)
                        .filter((s) -> Arrays.stream(b).noneMatch(s::equals))
                        .toArray(String[]::new);

System.out.println(Arrays.toString(result));
Run Code Online (Sandbox Code Playgroud)

该代码的主要租户是:

  • 过滤掉A中包含的任何元素,当且仅当它在B中不存在时(通过短路终端运算符noneMatch),检查该元素是否等于该流中的任何元素.
  • 将结果收集到a String[].

使用Set和再次使用流的另一种方法:

Set<String> setA = new HashSet<>(Arrays.asList(a));
Set<String> setB = new HashSet<>(Arrays.asList(b));

String[] setResult = setA.stream()
                         .filter((s) -> !setB.contains(s))
                         .toArray(String[]::new);
Run Code Online (Sandbox Code Playgroud)

指出非Set代码的主要问题是在最坏的情况下它是二次时间.此代码利用了常量访问时间Set#contains,并且应该在大约线性时间内运行.


Sau*_*ala 2

尝试这个:

String a[]={"a","b","c","d"}; 
String b[]={"b","c"}; 

List aLst = new ArrayList(Arrays.asList(a));
List bLst = new ArrayList(Arrays.asList(b));

aLst.removeAll(bLst);
System.out.println(aLst);
Run Code Online (Sandbox Code Playgroud)