检查两个列表的交集忽略区分大小写?

use*_*688 5 java list

我有两个清单

List<String> names1;
List<String> names2;
Run Code Online (Sandbox Code Playgroud)

我想要一个新列表返回给我,其中包含两个列表中都存在的值。这些值不应像retainAll 那样重复。

这是我原来的方法:

return ListUtils.intersection(names1, names2);
Run Code Online (Sandbox Code Playgroud)

它工作正常。但它区分大小写,因此 AbC 与 abc 不同。我需要比较不区分大小写。有没有另一种方法可以做到这一点?

And*_*ner 1

将一个列表的内容放入 a 中Set<String>,小写,例如:

Set<String> lcNames2 =    
    names2.stream().map(String::toLowerCase).collect(Collectors.toSet());
Run Code Online (Sandbox Code Playgroud)

然后:

List<String> intersection =
    names2.stream()
        .filter(n -> lcNames2.contains(n.toLowerCase())
        .collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

但请注意,当您不将相等作为等价关系来处理时,交集的概念是相当不明确的。

Lists.intersection有效地将两个列表视为集合,因为它不会两次添加相同的元素。

但是,如果您不处理 equals,那么“不要两次添加相同的元素”是什么意思?

  • 您的意思是只添加每个等价类的一个代表(例如,如果您已经添加了“ab”,则不会添加“Ab”)?如果是这样,您如何选择该代表?除非您添加规范化形式(例如小写字符串),否则您的结果取决于出现的顺序(可能是也可能不是您想要的)。
  • 您的意思是添加您看到的等价类的所有成员,只是不添加完全相同的字符串两次(例如添加“Ab”和“ab”,但不再添加“ab”)?

或者是其他东西。

具体的解决方案取决于您的实际需求。