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