我正在迭代两个集合并检查两个集合是否都包含相同的元素。我不能使用 Java 8。
编辑 1 年后:
我在问题中创建了该方法以检查两个集合是否包含相同的元素,而没有考虑我将两个Collection
实现传递到该方法中的事实。
但集合不能确定元素的排序方式。我正在迭代这些集合。因此,集合的某些实现可以随机顺序保存元素,同时包含相同的元素。
两个集合都包含可比较的元素和内容 定义为相等,如果所有元素都返回一个 0 的x.compareTo(y)
。
如果两个值的一个值为 null,则另一个值不为 null,则定义为不同值。 我想找到一种优雅的方式来比较无效性并防止 对最终compareTo()
的空检查。
我目前的实现:
public static <T extends Comparable<T>> boolean isSame(@Nullable Collection<T> a, @Nullable Collection<T> b) {
if (a == null || b == null) {
return (a == null && b == null);
}
if (a.size() != b.size()) {
return false;
}
Iterator<T> aIt = a.iterator();
Iterator<T> bIt = b.iterator();
while (aIt.hasNext()) {
T aValue = aIt.next();
T bValue = bIt.next();
if (aValue == null || bValue == null) {
if (aValue == null ^ bValue == null) {
return false;
}
//both null, don't compare, continue looping...
} else if (aValue.compareTo(bValue) != 0) {
return false;
}
}
return true;
}
如果两个值都为空,我想继续 while 循环,因为那是 定义为相等。
但我正在为这部分而苦苦挣扎:
if (aValue == null || bValue == null) {
if (aValue == null ^ bValue == null) {
return false;
}
}
问题:
有没有一种更优雅和可读的方式来比较 nullity,如果两者都不为 null,则进行进一步比较,如果只有一个为 null,则返回 false,如果两个值都为 null,则继续循环?
下面的顺序应该可以很好地工作:
if(aValue == null && bValue == null) continue; // both null; continue
if(aValue == null || bValue == null) return false; // any null; return false
if(aValue.compareTo(bValue) != 0) { // both non-null; compare
return false;
}
在 Java8 中,您可以构建一个替换比较序列的Comparator
,但代价是创建一个额外的对象(您需要决定是否关心这一点(:
Comparator<T> cmp = Comparator.nullsLast(Comparator.naturalOrder());
比较器将为您处理空比较(因为您假设两个null
相等(:
while (aIt.hasNext()) {
T aValue = aIt.next();
T bValue = bIt.next();
if (cmp.compare(aValue, bValue) != 0) {
return false;
}
}