java - 如何检查两个集合是否相等,忽略大小写?
问题描述
我想将小写和大写值视为相同,并确保两个集合相等(不必排序)
这是我的实现:
private boolean stringCollectionEqualsIgnoreCase(Collection<String> c1, Collection<String> c2)
{
Set<String> s1 = new HashSet<>();
c1.forEach(i -> s1.add(i.toLowerCase()));
Set<String> s2 = new HashSet<>();
c2.forEach(i -> s2.add(i.toLowerCase()));
return s1.size() == s2.size() && s2.containsAll(s1);
}
有没有更简单的方法来做到这一点?还是有自己的方法更好
解决方案
您的实际解决方案是非常可以接受的。已经够清晰了,应该有一个整体不错的表现。
您应该使用Set.equals()
而不是Set.containsAll()
. 它做同样的事情,但它使您无需将大小作为优化进行比较。
1)您的代码的流版本可能是:
private boolean stringCollectionEqualsIgnoreCase(Collection<String> c1, Collection<String> c2) {
return c1.stream()
.map(String::toLowerCase)
.collect(toSet())
.equals(c2.stream()
.map(String::toLowerCase)
.collect(toSet()));
}
2)这是第二种选择Treeset
。
我不确定它是否更容易,但它避免了显式循环并使逻辑更加明确:
private boolean stringCollectionEqualsIgnoreCase(Collection<String> c1, Collection<String> c2)
{
Comparator<String> comp = Comparator.comparing(String::toLowerCase);
Set<String> s1 = new TreeSet<>(comp);
Set<String> s2 = new TreeSet<>(comp);
s1.addAll(c1);
s2.addAll(c2);
return s1.equals(s2);
}
请注意,它会根据比较器删除重复项。这意味着它排序。因此,根据具体情况,它可能比您的实际解决方案更慢或更快。当然对于小Set
s来说比较无所谓。
推荐阅读
- android - view.requestLayout - setting layout of a button programmatically
- wordpress - 使用插件的自动导演网格列表
- html - onBlur 上的客户端验证
- java - 所有声明为类变量的数组都应该是静态的吗?
- pandas - pandas dataframe groupby a col 如果按行分组中存在值,则将相同的值分配给组行或从外部分配最大值并递增
- reactjs - 使用 laravel 配置 react SASS .module.scs 文件的问题
- javascript - 使用 JQuery 隐藏字符串开头的文本
- javascript - 有什么方法可以防止将 html div 的内容复制或将带有其样式的文本输入到剪贴板?
- ios - iOS 框架 XLPagerTabStrip 无法正常工作
- qml - QML 绑定循环在未知文件中检测到运行时警告