簡體   English   中英

在groovy中列出排序

[英]List sorting in groovy

我有一個圖書清單,它包含圖書ID,出版商名稱,聯系電話,地址,圖書發布日期和圖書狀態(有效,已刪除,已暫停)。 我想根據以下標准對列表進行排序:

  1. 按激活日期排序
  2. 將發布者名稱從A到Z排序
  3. 如果在同一日期范圍內有兩個發布商名稱,則應按照圖書狀態對其進行排序,並且訂單應處於活動狀態>已暫停>已刪除(這不是字母排序)

例如,結果應該是:

Activation Date: 18.10.2014
Test Book, ABC publisher, active
Test Book2, ABC publisher, suspended
Book3, XXYYBB publisher, active 

Activation Date: 19.10.2014
Test Book5, XXYYBB publisher, deleted
Test Book3, ZZZZ publisher, active
Test Book4, ZZZZ publisher, suspended

我的示例代碼:

booklist.sort{ x,y ->
  x.activateDate <=> y.activateDate ?: x.publisherName <=> y.publisherName
}

如何進行第三次手動檢查書籍狀態?

解決方案1: enum

如果狀態確實限於給出的三個確切值,那么您應該已經使用過類似的東西了:

enum BookStatus { active, suspended, deleted }

然后在Book類中:

class Book {
    ...
    BookStatus status
}

由於Enum類已經具有自然排序順序(聲明順序),因此只需在比較器閉包中添加另一個elvis( ?: :)子句:

booklist.sort { x, y ->
    x.activateDate <=> y.activateDate ?:
        x.publisherName <=> y.publisherName ?:
        x.status <=> y.status
}

解決方案2:狀態排序List

請參閱@cfrick的解決方案

解決方案3:狀態排序Map

與基於List的解決方案相比,此解決方案只有幾個小優勢:

  • 通過LinkedHashMap平均密鑰搜索具有算法復雜度O(1),而通過ArrayList平均元素搜索具有O(n)
  • statusOrder[x.status] <=> statusOrder[y.status]是一個比statusList.indexOf(x.status) <=> statusList.indexOf(y.status)更簡單的表達式

這里假設Book.status是一個String

final statusOrder = [ active:0, suspended:1, deleted:2 ].asImmutable()
booklist.sort { x, y ->
    x.activateDate <=> y.activateDate ?:
            x.publisherName <=> y.publisherName ?:
            statusOrder[x.status] <=> statusOrder[y.status]
}

如果由於某種原因我無法使用Enum解決方案,我可能會使用List解決方案,除非有大量(超過20?)個狀態值,在這種情況下我會使用Map解決方案。

如果這些是字符串,您可以使用列表來定義重要性,然后使用ufo-operator在此列表中使用索引

final order = ['active','suspended','deleted']

def l = [
        [status: 'deleted'],
        [status: 'active'],
        [status: 'suspended'],
        [status: 'active'],
        [status: 'suspended'],
]

println l.sort{ a,b -> order.indexOf(a.status) <=> order.indexOf(b.status) }
// -> [[status:active], [status:active], [status:suspended], [status:suspended], [status:deleted]]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM