繁体   English   中英

检查两个列表以确保不区分大小写的交集?

[英]Check two lists for intersection ignoring case-sensitive?

我有两个清单

List<String> names1;
List<String> names2;

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

这是我最初的方法:

return ListUtils.intersection(names1, names2);

而且效果很好。 但这是区分大小写的,因此AbC与abc不同。 我需要比较不区分大小写。 还有另一种方法吗?

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

Set<String> lcNames2 =    
    names2.stream().map(String::toLowerCase).collect(Collectors.toSet());

然后:

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

但是请注意,当您不将相等视为等价关系时,交集的概念定义不明确。

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

但是,如果您不使用等于,那么“不两次添加相同的元素”是什么意思?

  • 您是说只为每个等效类添加一个代表(例如,如果您已经添加了“ ab”,则不会添加“ Ab”)? 如果是这样,您如何挑选该代表? 除非您添加规范化的形式(例如,小写的字符串),否则结果取决于外观顺序(可能与您期望的顺序无关)。
  • 您是说要添加您看到的等效类的所有成员,只是不两次添加完全相同的字符串(例如,同时添加“ Ab”和“ ab”,而不是再次添加“ ab”)吗?

或者是其他东西。

确切的解决方案取决于您的实际要求。

使用交集方法之前,只需制作一个小写副本:

return ListUtils.intersection(names1.stream().map(String::toLowerCase).collect(Collectors.toList()),
            names2.stream().map(String::toLowerCase).collect(Collectors.toList()));

您可以使用retainAll

names1.retainAll(names2);

希望对您有所帮助! :)

您可以事先遍历每个列表,并将每个元素转换为小写,然后运行交集。

就像是:

List<String> names1;
List<String> names2;

for(int i=0; i < names1.size(); i++){
    names1[i] = names2[i].toLowerCase();
}

for(int i=0; i < names2.size(); i++){
    names2[i] = names2[i].toLowerCase();
}

return ListUtils.intersection(names1, names2);

您将必须确切地查找如何更改列表中的值,我不记得它是否与数组或其他方法相同。 您可能还必须从for循环条件中添加1或从中减去1,因为我不确定.size()是否包含0。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM