Swift:在保持订单完整的同时排序对象属性数组

时间:2017-11-15 04:05:44

标签: ios arrays swift sorting

正如这个问题的长名称所示,我试图按这些对象的属性对对象数组进行排序,但是我遇到了返回数组的顺序问题。基本上,我的数据库结构按顺序包含每个日期,然后在该日期的目录下以升序数字表示。下面是结构的直观表示:

Balances
   -11/7/17
        -0
            -name: "Name 1 Here"
        -1
            -name: "Name 2 Here"
        -2
            -name: "Name 3 Here"
   -11/8/17
        -0
            -name: "Name 1 Here"
        -1
            -name: "Name 2 Here"
        -2
            -name: "Name 3 Here"
   -11/9/17
        -0
            -name: "Name 1 Here"
        -1
            -name: "Name 2 Here"
        -2
            -name: "Name 3 Here"

当我通过SingleValueEvent从数据库中检索数据并将其添加到自定义对象数组时,由于某种原因,数组中的数据会出现故障,并且不会保持正确的顺序,因为数据是存储在数据库中。为了解决这个问题,我尝试使用以下代码来对数组进行排序:

self.tableArray = self.tableArray.sorted(by: { $0.date < $1.date })

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

使用两行代码中的任何一行后返回的数组按每个对象的日期排序,但数据库中日期下的每个项目的顺序都搞定了。我知道这有点令人困惑,这就是为什么我在下面加入了一个视觉表示,我希望能有所帮助。

Original Array:

 Item 1: 

  date: 11/14/17
  name: Name 1

 Item 2: 

  date: 11/13/17
  name: Name 1

 Item 3: 

  date: 11/13/17
  name: Name 2

 Item 4: 

  date: 11/7/17
  name: Name 1

Sorted Array:

 Item 1: 

  date: 11/7/17
  name: Name 1

 Item 2: 

  date: 11/13/17
  name: Name 2

 Item 3: 

  date: 11/13/17
  name: Name 1

 Item 4: 

  date: 11/14/17
  name: Name 1

谢谢!

1 个答案:

答案 0 :(得分:1)

可能有几个原因,它在存储中被序列化或排序的方式 - 没有具体的洞察你是否使用CoreData,Real,SQLite或其他......

TL; DR,如果您想确保订单完全符合您的要求,并且看起来您有多个排序标准,请将该标准定义为属性。您不能总是保证持久性将维护顺序,因此将其构建到模式中。

即。

{name, date}

添加额外属性

{name, date, order}.

订单属性可以是全局唯一的,也可以在该日期的项目中唯一。

您可以排序两次(第二种排序稳定),或者更好地定义首先按日期比较,然后按另一种比较的比较。

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