【问题标题】:Reverting a sorted array back to its original order将排序后的数组恢复为其原始顺序
【发布时间】:2018-10-06 03:05:39
【问题描述】:

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

在我下面的代码中,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 方法以简单地显示数据而不进行任何排序? (意味着它准确地显示了数据在模型中的设置方式)

【问题讨论】:

    标签: arrays swift sorting uicollectionview


    【解决方案1】:

    你需要

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

    【讨论】:

      【解决方案2】:

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

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

      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()
      

      【讨论】:

      • 这很有帮助。但我没有更改所有数据源方法,而是复制了未排序的数组。然后在 No Sort 按钮方法中,我使用 allAnimalsArray = originalSort.
      • 这仍然是相同的解决方案。您所做的只是使用不同的变量名。并且不要忘记您可以为有用的答案投票。
      猜你喜欢
      • 1970-01-01
      • 2016-01-17
      • 2022-06-18
      • 2021-07-31
      • 1970-01-01
      • 2021-01-02
      • 1970-01-01
      • 1970-01-01
      • 2014-07-29
      相关资源
      最近更新 更多