public int compare(Event e1, Event e2) {
if (e1 == null && e2 == null) {
return 0;
} else if (e1 == null && e2 != null) {
return -1;
} else if (e1 != null && e2 == null) {
return 1;
} else if (e1.getDate() == null && e2.getDate() == null) {
return 0;
} else if (e1.getDate() == null && e2.getDate() != null) {
return -1;
} else if (e1.getDate() != null && e2.getDate() == null) {
return 1;
} else
return e1.getDate().compareTo(e2.getDate());
}
嘿,想问一些更好的方法来编写上面的代码,以便进行比较器练习。 要求是以两个空值相等且空值始终小于(相比之下(非空值的方式处理空值。
这段代码是完全有用的,但在我看来它只是粗略的。 想在这里听到一些意见和开胃小斋:)
你快到了。只需删除一些额外的不必要的检查即可。
也没有必要使用else if
,因为你正在return
。
public int compare(Event e1, Event e2) {
// nulls are equal
if (e1 == null && e2 == null) {
return 0;
}
// A null is always less than anything.
if (e1 == null) {
return -1;
}
if (e2 == null) {
return 1;
}
// null dates are equal
if (e1.getDate() == null && e2.getDate() == null) {
return 0;
}
// A null is always less than anything.
if (e1.getDate() == null) {
return -1;
}
if (e2.getDate() == null) {
return 1;
}
// All present - use normal date comparison.
return e1.getDate().compareTo(e2.getDate());
}
你不能跳过与 null 的比较,你可以抛出 NullPointerException 来通知你不比较 null,或者你可以写一些更专业的代码,这是非常主观的,例如:
public int compare(Event e1, Event e2) {
if (e1 == null) return -compareToNull(e2);
if (e2 == null) return compareToNull(e1);
if (e1.getDate() == null) return -compareToNull(e2.getDate());
if (e2.getDate() == null) return compareToNull(e1.getDate());
return e1.getDate().compareTo(e2.getDate());
}
private int compareToNull(Object e) {
return e == null ? 0 : 1;
}
或代码高尔夫风格:
public int compare(Event e1, Event e2) {
if (e1 == null || e2 == null) return compareNull(e1, e2);
if (e1.getDate() == null || e2.getDate() == null) return compareNull(e1.getDate(), e2.getDate());
return e1.getDate().compareTo(e2.getDate());
}
private int compareNull(Object e1, Object e2) {
return e1 == null && e2 == null ? 0 : e2 == null ? 1 : -1;
}