想象一下,我有以下列表
清单a-("One", "Two", "Three", "Four", "Five")
清单b-("oNe", "two", "THREE")
我想考虑b作为a(忽略案例)的一个子集.
现在我正在使用循环和一些像这样的lambda
boolean subset = true;
for(String bWord : b) {
if(!a.stream().anyMatch(aWord -> aWord.equalsIgnoreCase(bWord))) {
subset = false;
break;
}
}
Run Code Online (Sandbox Code Playgroud)
是否有更短的方法可以用lambdas做到这一点?
将数组转换为小写:
a.stream().map(String::toLowerCase).collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)
并使用containsAll:
b.containsAll(a);
Run Code Online (Sandbox Code Playgroud)
您可以转换a为HashSet小写Strings 的 a,这将使检查子集更快(因为检查 的任何元素是否b属于需要恒定时间aset,而不是检查包含在 a 中所需的线性时间List):
Set<String> aset = a.stream().map(String::toLowerCase).collect(Collectors.toCollection(HashSet::new));
boolean subset = b.stream().map(String::toLowerCase).allMatch(aset::contains);
Run Code Online (Sandbox Code Playgroud)
PS,您使用的是子集,但实际上您要检查的不是一个是否List是另一个的子集,因为您的Lists 不是Sets,这意味着它们可能包含重复值。首先以Sets开头会更有意义。
编辑:
如果 usingcontainsAll对你来说更好,至少在两个Sets 而不是两个Lists上运行它。您将获得线性运行时间而不是二次运行时间:
Set<String> aset = a.stream().map(String::toLowerCase).collect(Collectors.toCollection(HashSet::new));
Set<String> bset = b.stream().map(String::toLowerCase).collect(Collectors.toCollection(HashSet::new));
boolean subset = aset.containsAll(bset);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
294 次 |
| 最近记录: |