我有一个POJO看起来像这样:
public class Pojo implements Comparable<Pojo> {
private String type;
private String journalId;
private Date bookingDate;
private Long account;
private String description;
private BigDecimal debit;
private BigDecimal credit;
....
}
我想对这些POJO的列表进行排序。目前,我的
compareTo
方法如下所示:@Override
public int compareTo(EfdisJournal other) {
int i = this.type.compareTo(other.type);
if (i != 0)
return i;
if (this.bookingDate != null && other.bookingDate != null)
i = this.bookingDate.compareTo(other.bookingDate);
if (i != 0)
return i;
if (this.journalId != null && other.journalId != null)
i = this.journalId.compareTo(other.journalId);
if (i != 0)
return i;
return this.account.compareTo(other.account);
}
如果使用此
compareTo
方法运行排序,则会出现此java.lang.IllegalArgumentException: Comparison method violates its general contract
错误。我做了一些谷歌,我认为这是发生的,因为某些字段在比较时是null
。但是我不知道如何解决这个问题,或者我不知道为什么会出现该错误。比较应按以下方式进行:第一个按
type
比较,然后按bookingDate
比较,第三个按journalId
比较,最后按account
比较。所有比较都应该上升。type
永远不会为空bookingDate
可以为空journalId
可以为空account
永远不会为空编辑:
可悲的是,我无法实现该方法,因此需要按顺序进行。但是,我解决了我遇到的问题,因为存储过程产生了2个结果集,第二个结果集是根据需要排序的,因此,我唯一要做的就是使用第二个结果集而不是第一个结果集。
最佳答案
您需要处理一个实例具有空bookingDate
且另一个实例具有非空bookingDate
的情况。
您应该决定是否将bookingDate
为空的内容排序为非bookingDate
为空的内容排序之前或之后,并适当地编写compareTo。 (然后是journalId
。)然后您可以获得顺序一致的订单。
例如:
@Override
public int compareTo(EfdisJournal other) {
int i = this.type.compareTo(other.type);
if (i != 0) {
return i;
}
if ((this.bookingDate==null) ^ (other.bookingDate==null)) {
return (this.bookingDate==null ? -1 : 1);
}
if (this.bookingDate != null && other.bookingDate != null) {
i = this.bookingDate.compareTo(other.bookingDate);
}
if (i != 0) {
return i;
}
if ((this.journalId==null) ^ (other.journalId==null)) {
return (this.journalId==null ? -1 : 1);
}
if (this.journalId != null && other.journalId != null) {
i = this.journalId.compareTo(other.journalId);
}
if (i != 0) {
return i;
}
return this.account.compareTo(other.account);
}