我想同等对待小写和大写值,并确保两个集合相等(不必排序)
这是我的实现:
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/