我有一个图书清单,其中包含图书ID,出版商名称,联系电话,地址,图书发布日期和图书状态(有效,已删除,已暂停)。我想根据以下标准对列表进行排序:
例如,结果应为:
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
}
如何对书籍状态进行第三次手动检查?
答案 0 :(得分:3)
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
}
List
参见@cfrick的解决方案
Map
与基于列表的解决方案相比,此解决方案只有几个小优势:
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
解决方案。
答案 1 :(得分:2)
如果这些是字符串,您可以使用列表来定义重要性,然后使用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]]