如何处理 compare() 中的空字段?

2022-09-01 21:43:23

在Java中,我使用一个类,其中某些字段可以是。例如:null

class Foo {
    String bar;
    //....
}

我想为这个类写一个BarComparator,

    private static class BarComparator
            implements Comparator<Foo> {
        public int compare( final Foo o1, final Foo o2 )
        {
            // Implementation goes here
        }
    }

有没有一种标准的方法来处理这样一个事实,即任何, , , 都可以是 ,而不写很多嵌套...?o1o2o1.baro2.barnullifelse

干杯!


答案 1

我想你可以用一个小的静态方法包装对字段compareTo方法的调用,以将null排序为高或低:

static <T extends Comparable<T>> int cp(T a, T b) {
     return
         a==null ?
         (b==null ? 0 : Integer.MIN_VALUE) :
         (b==null ? Integer.MAX_VALUE : a.compareTo(b));
}

简单用法(多个字段与通常一样):

public int compare( final Foo o1, final Foo o2 ) {
    return cp(o1.field, o2.field);
}

答案 2

感谢您的回复!通用方法和Google比较器看起来很有趣。

我发现Apache Commons Collections中有一个NullComparator(我们目前正在使用):

private static class BarComparator
        implements Comparator<Foo>
{
    public int compare( final Foo o1, final Foo o2 )
    {
        // o1.bar & o2.bar nulleness is taken care of by the NullComparator.
        // Easy to extend to more fields.
        return NULL_COMPARATOR.compare(o1.bar, o2.bar);
    }

    private final static NullComparator NULL_COMPARATOR =
                                            new NullComparator(false);
}

注意:我在这里专注于这个领域,以保持它切中要害。bar


推荐