比较是传递的



我有一个像这样的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;
    ....
}

我想整理这些波约斯的列表。当前我的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错误。我做了一些Google,我认为这是因为某些字段是null。但是我不知道如何解决这个问题,或者如果我是正确的原因。

比较应该像这样起作用:通过type进行比较,然后通过bookingDate进行比较,为journalId比较,最终比较account。所有比较都应上升。

  • type从不null
  • bookingDate可能为null
  • journalId可能为null
  • account永远不会为null

编辑:

可悲的是,我无法实现该方法,因此可以根据需要进行订单。但是,我解决了我遇到的问题,因为存储的过程产生了2个结果集,第二个结果是根据需要的订单,所以我唯一要做的就是使用第二个结果集而不是第一个。

<</p>

您需要处理一个实例的情况,另一个实例具有null bookingDate,而另一个具有非null bookingDate。您应该确定是否应在使用非null bookingDate之前或之后对NULL bookingDate进行分类,并适当地编写您的比较。(然后也是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);
}

您正在忽略 bookingDate和/或 journalId的情况,而另一个则无效。

相关内容

  • 没有找到相关文章

最新更新