2017-09-12 58 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爲空且其中一個爲空而另一個爲非空的情況。