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

时间:2018-02-05 22:42:34

标签: java list

我有两个列表

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

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

这是我最初的做法:

return ListUtils.intersection(names1, names2);

它工作正常。但它区分大小写,因此AbC与abc不同。我需要比较不区分大小写。还有另一种方法吗?

4 个答案:

答案 0 :(得分:1)

将一个列表的内容放入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有效地将两个列表视为集合,因为它不会两次添加相同的元素。

但如果你不处理平等,那意味着什么&#34;不要两次添加相同的元素&#34;?

  • 您的意思是您只添加每个等值类别的一个代表(例如,您不会添加&#34; Ab&#34;如果您已添加&#34; ab&#34;)?如果是这样,你如何选择那个代表?除非你添加一个标准化的表格(例如下面的字符串),否则你的结果取决于外观的顺序(可能是你想要的也可能不是你想要的)。
  • 你的意思是你添加你看到的等价类的所有成员,而不是两次添加完全相同的字符串(例如,添加&#34; Ab&#34;和&#34; ab&#34;,但是不再添加&#34; ab&#34;再次)?

或其他。

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

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

您可以使用retainAll

names1.retainAll(names2);

希望对你有所帮助! :)

答案 3 :(得分:0)

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

类似的东西:

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,因为我不确定.size()是否包含0。