【问题标题】:Swift 4: Sorting an Array by 3 Conditions [duplicate]Swift 4:按 3 个条件对数组进行排序 [重复]
【发布时间】:2018-01-06 02:09:54
【问题描述】:

我去年为某人制作了一个应用程序,以便他们可以跟踪客户的收入。那个时候我没有考虑过里面有不同年份的条目会发生什么,果然,2018年来的时候,条目的排序就乱了。我无法弄清楚如何在两年内对我的条目数组进行排序,如果你们中的任何人能帮助我解决这个问题,我将不胜感激。以下是我遇到问题的特定页面的格式和代码。

格式:

有一个 TableView 的结构如下,按照后面提到的标准进行排序。由于 2017 年和 2018 年都有条目(日期的末尾是年份),因此 tableView 使用的数组的排序变得混乱。

日期 |姓名 |钱 |余额

代码:

阵列模型:

struct BalanceUser {

    var id = ""

    var name = ""

    var date = ""

    var money = ""

    var balance = ""

    var status = ""

    var year = ""

}

我在数组结构中添加了一个新变量 year,以便我可以使用它进行排序。

当前排序代码:

self.sortedTableArray.sort(by: { (object1, object2) -> Bool in
     if object1.date == object2.date {
             return object1.id < object2.id
     } else {
             return object1.date < object2.date
     }
})

self.sortedTableArray.sort(by: { (object1, object2) -> Bool in
         return object1.year < object2.year
})

目前,使用上面的代码,2018 年的条目显示在 2017 年的条目上方。我想要它以便所有条目都按照以下标准进行排序:

  • 如果两个条目的日期相同,则应按id排序
  • 如果两个整数的日期不相同,则按日期排序
  • 所有条目都应按年份排序,以便 2018 年的条目显示在 2017 年的条目下方。

谢谢!

【问题讨论】:

  • 为什么你的日期是一个单独年份的字符串而不是Date?如果您使用了正确的数据类型,那么您的排序将正常工作
  • 这是因为我需要将日期以特定的形式显示给用户。
  • 那是NSDateFormatter的工作;不是你如何存储日期
  • 我这样做的原因是因为我需要将日期存储在数据库中,这对我来说是最好的方法。
  • 如果您的数据库没有 Date 类型,那么您应该将日期存储为 RFC3339 字符串。然后,您可以在获取数据时轻松地将字符串转换为 Swift Date

标签: arrays swift sorting swift4


【解决方案1】:

您的排序关闭还应该比较条目的年份和日期。

self.sortedTableArray.sort(by: {(obj1, obj2) -> Bool in
    if obj1.date == obj2.date && obj1.year == obj2.year {
        return obj1.id < obj2.id
    }
    return obj1.year < obj2.year || obj1.date < obj2.date
})

这里,如果两个对象的dateyear相同,则id被排序。如果不是,则比较对象的years,然后是它们的日期,使早年的对象在晚年之前出现。

理想情况下,这些结构字段不应是字符串类型。这些日期和年份应该是 Date 类型,或者至少在逻辑上是 Ints。

【讨论】:

  • 随着您引入越来越多的排序标准,这个 anding 和 oring 变得非常复杂。见stackoverflow.com/a/37604010/3141234
  • 感谢代码!!我不知道您可以返回一件事或另一件事,而且我没想到要添加 && 部分。谢谢!
  • 嗨 Miket25,我尝试了代码但没有用,id 排序现在搞砸了,2018 年的条目显示在 2017 年的上方。你能帮忙吗?
猜你喜欢
  • 1970-01-01
  • 2012-02-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-02
  • 1970-01-01
相关资源
最近更新 更多