列出另一个List <String>的<String>子集忽略大小写?

pre*_*oid 4 java

想象一下,我有以下列表

清单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做到这一点?

Mar*_*oun 6

将数组转换为小写:

a.stream().map(String::toLowerCase).collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

并使用containsAll:

b.containsAll(a);
Run Code Online (Sandbox Code Playgroud)


Era*_*ran 5

您可以转换aHashSet小写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)