以优雅的方式检查两个参数为null

Jac*_*1re 6 java collections null iterator java-7

我正在迭代两个集合并检查两个集合是否包含相同的元素.我不能使用Java 8.


编辑1年后:

我在问题中创建了方法,以检查两个集合是否包含相同的元素,而不考虑我将两个Collection实现传递给方法的事实.

但Collection不确定元素的排序方式.我正在迭代收藏品.因此,Collection的某些实现可以以随机顺序保存元素,同时包含相同的元素.


如果所有元素都返回0 ,则两个集合都包含可比较的元素,并且内容定义为相等.x.compareTo(y)

如果其中一个为空,则将两个值定义为不同,而不是另一个.我想找到一种优雅的方法来比较nullity并防止对final进行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;
}
Run Code Online (Sandbox Code Playgroud)

如果两个值都为null,我想继续while循环,因为它被定义为相等.

但我正在努力解决这个问题:

if (aValue == null || bValue == null) {
        if (aValue == null ^ bValue == null) {
            return false;
        }
}
Run Code Online (Sandbox Code Playgroud)

题:

是否有更优雅和可读的方法来比较nullity,如果两者都不为null,则进行进一步比较,如果只有一个为null,则返回false,如果两个值都为null,则继续循环?

Nam*_*man 6

以下序列应该运作良好:

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;
}
Run Code Online (Sandbox Code Playgroud)

  • @ JacksOnF1re当然.关于桌子和头脑风暴的更多想法是我总是投票的. (2认同)