java comparable null_java – 关于null的Comparable和Comparator合同

可比较的合同指定e.compareTo(null)必须抛出NullPointerException。

Note that null is not an instance of any class, and e.compareTo(null) should throw a NullPointerException even though e.equals(null) returns false.

另一方面,Comparator API没有提到当比较null时需要发生什么。考虑以下尝试使用通用方法,该方法接受Comparable,并返回一个将空值作为最小元素的Comparator。

static > Comparator nullComparableComparator() {

return new Comparator() {

@Override public int compare(T el1, T el2) {

return

el1 == null ? -1 :

el2 == null ? +1 :

el1.compareTo(el2);

}

};

}

这使我们可以执行以下操作:

List numbers = new ArrayList(

Arrays.asList(3, 2, 1, null, null, 0)

);

Comparator numbersComp = nullComparableComparator();

Collections.sort(numbers, numbersComp);

System.out.println(numbers);

// "[null, null, 0, 1, 2, 3]"

List names = new ArrayList(

Arrays.asList("Bob", null, "Alice", "Carol")

);

Comparator namesComp = nullComparableComparator();

Collections.sort(names, namesComp);

System.out.println(names);

// "[null, Alice, Bob, Carol]"

所以问题是:

>这是一个比较器的可接受的使用,还是它违反了一个关于比较null和抛出NullPointerException的不成文规则?

>是否是一个好主意,甚至必须排序包含空元素的列表,或者是一个设计错误的确定的标志?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值