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)
现在我的问题是,有没有其他更好的方法来实现这一目标
如果[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)
您可以缩短代码
TreeSet set = new TreeSet(Arrays.asList(a));
set.removeAll(Arrays.asList(b));
Run Code Online (Sandbox Code Playgroud)
实际上,这扩展了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)
该代码的主要租户是:
noneMatch),检查该元素是否等于该流中的任何元素.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,并且应该在大约线性时间内运行.
尝试这个:
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)
| 归档时间: |
|
| 查看次数: |
1313 次 |
| 最近记录: |