gpt4 book ai didi

sorting - groovy中的列表排序

转载 作者:行者123 更新时间:2023-12-01 11:36:36 25 4
gpt4 key购买 nike

我有一个图书 list ,其中包含图书 ID、出版商名称、联系电话、地址、图书发行日期和图书状态(事件、删除、暂停)。我想根据以下标准对列表进行排序:

  • 按激活日期排序
  • 将出版商名称从 A 到 Z 排序
  • 如果在同一日期范围内有两个出版商名称,则应根据图书状态对其进行排序,并且订单应为事件 > 暂停 > 删除(这不是字母排序)

  • 例如,结果应该是:
    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
    与基于列表的解决方案相比,此解决方案只有几个小优势:
  • 通过 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解决方案。

    关于sorting - groovy中的列表排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26453553/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com