将排序后的数组还原为其原始顺序

时间:2018-10-06 03:05:40

标签: arrays swift sorting uicollectionview

我正在对Collection视图中的数据数组进行排序。我想通过3种方式对数据进行排序:按字母顺序,按数字方式,根本不排序(根本不排序应该对数据在模型中的设置顺序进行排序。)排序通过3个不同的UIButton进行。

在下面的代码中,allAnimalsArray是在“集合视图”中显示的完整数据数组。

// Animal Name button pressed
let sortAZ = allAnimalsArray.sorted(by: { $0.animalName < $1.animalName })
allAnimalsArray = sortAZ
allAnimalsCollectionView.reloadData()

// Animal Weight button pressed
let sortByWeight = allAnimalsArray.sorted(by: { $0.pounds < $1.pounds })
allAnimalsArray = sortByWeight
allAnimalsCollectionView.reloadData()

// NO SORT button pressed
let noSorting = allAnimalsArray
allAnimalsArray = noSorting
allAnimalsCollectionView.reloadData()

我的问题是NO SORT方法不会改变排序。它的顺序与之前按过的顺序相同。

据我了解,sorted对数据进行复制,因此保留了原始数据(而.sort修改了原始数据)。

如何更改上面的NO SORT方法以仅显示数据而不进行任何排序? (这表示精确地显示了模型中数据的设置方式

2 个答案:

答案 0 :(得分:1)

如果原始数组没有可排序的顺序,那么我建议您不要修改原始数组。保留一个基于当前排序的第二个数组,并使用该第二个数组作为集合视图的数据模型的基础。

当用户选择其他排序方法时,您只需从未经修改的原始数组中更新第二个数组,然后重新加载集合视图即可。

let allAnimalsArray = ... // the original array that you never modify
var sortedArray = [YourAnimalClass]()

您所有的数据源方法都基于sortedArray

如果用户选择“不排序”,则您可以这样做:

sortedArray = allAnimalsArray
allAnimalsCollectionView.reloadData()

如果用户选择其中一种,则您可以这样做:

sortedArray.allAnimalsArray.sorted(by: { $0.whatever < $1.whatever })
allAnimalsCollectionView.reloadData()

答案 1 :(得分:1)

您需要

  1. 要么保存整个未排序数组的副本,然后在需要还原时使用
  2. 或至少保存该数组的索引,以便您可以使用它们强加 原始未排序状态