【问题标题】:Sort An Array in Objective C with Multiple Items [closed]对具有多个项目的Objective C中的数组进行排序[关闭]
【发布时间】:2014-05-05 19:11:57
【问题描述】:

是的,他们发布了,但没有一个对我有用,我需要对多维数组进行排序, 这是我的数组看起来像

(
{
    FileDate = "2014-02-21T19:08:50Z";
    FileName = "Cyber";
    FileSize = 65;
    FileURL = "Inciden.pdf";
},
    {
    FileDate = "2014-02-21T19:08:47Z";
    FileName = "Products";
    FileSize = 64;
    FileURL = "Plan.pdf";
},
    {
    FileDate = "2014-02-21T19:08:36Z";
    FileName = "Network";
    FileSize = 70;
    FileURL = "cPlan.pdf";
},

)

它是简单的 NSArray * Fulldata ; 现在谁能告诉我最好的排序方法。

【问题讨论】:

  • 发布您的代码,展示您如何尝试对此进行排序。并解释数组应该如何排序。
  • 顺便说一句,这不是多维数组,而是字典数组。
  • 请显示您通过搜索找到的其他帖子,并解释为什么它们不适合您。

标签: ios objective-c nsarray


【解决方案1】:

我假设你想按日期排序......

NSArray *sortedArray = [FullData sortedArrayUsingDescriptors:@[[NSSortDescriptor sortDescriptorWithKey:@"FileDate" ascending:NO]];

应该可以的。

【讨论】:

  • 为什么这被否决了?
  • 这是一个完全合理的答案,基于 OP 希望根据日期进行排序的假设。有很多方法可以做到这一点。
【解决方案2】:

您发布了一系列字典的转储。有许多方法可以让您以不同的方式对数组进行排序。

我偏爱基于块的方法,例如 sortedArrayUsingComparator(用于不可变数组)或 sortUsingComparator(用于对可变数组进行就地排序)。

这两种方法都采用一个比较器块,该块比较数组中的 2 个对象并决定哪个应该是第一个,每次比较返回 NSOrderedDescending 或 NSOrderedAscending。

然后系统通过要求您的代码块比较对象对来对数组进行排序。

您还可以使用使用排序描述符的方法(例如sortedArrayUsingDescriptors:)如果您需要使用多个键进行排序,则基于描述符的方法是更好的选择(例如,先根据姓氏排序名称数组,然后是名字在姓氏中,然后在名字中按年龄。)

为了帮助您对数组进行排序,我们需要知道您想使用什么标准对其进行排序。

【讨论】:

  • 如果我错了,请纠正我,但不使用 NSComparator 会慢得多,因为它类似于插入排序并且可能需要 O(n^2) 时间,而 NSSortDescriptor 应该提供字典上的 O(n log n) 还是 O(n)?
  • 为什么这被否决了?
  • @smyrgl 你认为为什么使用不同的算法?唯一的区别是在排序过程中如何比较每对值。
  • 嗯,这就是为什么我更多地问它作为一个问题,但使用 NSComparator 意味着您将在经典的插入排序中遍历数组并检查一对项目以查看它们是否向上移动或向下,因此将被移动一次,并且插入排序具有最坏的二次时间情况。在 NSDictionary 的键上使用 NSSortDescriptor 虽然它类似于桶排序并且应该在线性时间内是可能的。我在使用 NSDictionary 对 NSCountedSet 进行排序时对此进行了测试,它的速度要快得多(但我又不是这方面的权威)。
  • @smyrgl,你错了。具体的排序算法在操作系统的控制下,可以在运行时进行优化。根据我的经验,它的性能是 O(n log n) 或更好,这表明操作系统通常会建议使用快速排序之类的算法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-25
相关资源
最近更新 更多