java - 如何检查两个集合是否相等,忽略大小写?

标签 java collections

我想同等对待小写和大写值,并确保两个集合相等(不必排序)

这是我的实现:

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来说,这并不重要。

关于java - 如何检查两个集合是否相等,忽略大小写?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54892933/

相关文章:

java - 在将元素添加到集合之前声明迭代器

java - 多个 Controller 共享的ExceptionHandler

java - 太空侵略者游戏

java - 在另一个 Activity 中检索共享首选项字符串

java - 通用边界 "Enum<T> & Foo"和 "Enum<? extends Foo>"之间有区别吗

java - 将 Coldfusion 查询结果转换为格式化的 javascript 数组

java - 如何打印数据库返回的对象中的数据作为对象列表?

java - 为什么不能在构造函数中同时传递集合和比较器?

objective-c - iOS SDK 标准集合

java - 无法使用带有 List<SubType> 的 List<SuperType> 参数调用函数