我同意 Jon Skeet 的观点(这很简单 :)。我尝试实现一个非常简单的decorator:
class NullComparators {
static <T> Comparator<T> atEnd(final Comparator<T> comparator) {
return new Comparator<T>() {
public int compare(T o1, T o2) {
if (o1 == null && o2 == null) {
return 0;
}
if (o1 == null) {
return 1;
}
if (o2 == null) {
return -1;
}
return comparator.compare(o1, o2);
}
};
}
static <T> Comparator<T> atBeginning(final Comparator<T> comparator) {
return Collections.reverseOrder(atEnd(comparator));
}
}
给定一个比较器:
Comparator<String> wrapMe = new Comparator<String>() {
public int compare(String o1, String o2) {
return o1.compareTo(o2);
}
};
还有一些测试数据:
List<String> strings = Arrays.asList(null, "aaa", null, "bbb", "ccc", null);
您可以在末尾使用空值进行排序:
Collections.sort(strings, NullComparators.atEnd(wrapMe));
[aaa, bbb, ccc, null, null, null]
或开头:
Collections.sort(strings, NullComparators.atBeginning(wrapMe));
[空,空,空,ccc,bbb,aaa]