2017-09-12 43 views
1

我有一个POJO看起来像这样:的CompareTo是传递

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比较。但我不知道如何解决这个问题,或者如果我是正确的,为什么会出现这个错误。

的比较应该像这样工作:1通过type比较,然后通过bookingDate比较,为第13由journalId,最后由account比较比较。所有的比较应该是递增的。

  • type永远不能为null
  • bookingDate可以为空
  • journalId可以为空
  • account永远不能为null

编辑:

可悲的是我无法实现该方法,因此该命令是根据需要的。然而,我解决了我的问题,因为存储过程产生了2个结果集,其中第二个是需要的顺序,所以我唯一要做的就是使用第二个结果集而不是第一个结果集。

+0

如何你想根据现场是空订购的元素? – Pshemo

+0

您应该决定是否应该使用'null' bookingDate对具有非null bookingDate的_before_或_after_事物进行排序,并适当编写'compareTo'。 (然后'journalId'。)然后你可以得到一个顺序排序的订单。 – khelwood

+0

如果'bookingdate'为null,那么它应该通过'journalId'进行比较,如果它们为null,那么它应该比较'account'。我会更新结果应该如何看起来像 – XtremeBaumer

回答

1

您需要处理的情况是:一个实例的空值为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); 
} 
+0

你能解释一下'^'做什么吗? – XtremeBaumer

+0

'^'是排他性的:如果它的其中一个操作数为真,而另一个为假,则返回true。 – khelwood

+0

啊没关系。可悲的是你的解决方案不会产生我正在寻找的结果。是否有可能获得一个列表,这是我发布的示例订购的? – XtremeBaumer

1

您忽略了其中bookingDate和/或journalId为空且其中一个为空而另一个为非空的情况。