【问题标题】:Sorting arrays in Objective-C在 Objective-C 中对数组进行排序
【发布时间】:2012-04-25 22:39:35
【问题描述】:

我目前正在尝试自学 Objective-C,并且正在玩一个需要对数组进行排序的练习。

我设法使用以下代码完成了它:

NSSortDescriptor * newSortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"title" ascending:TRUE];
NSArray *sortDescriptors = [NSArray arrayWithObject:newSortDescriptor];
[self.theBookStore sortUsingDescriptors:sortDescriptors];

我的问题是这里实际发生了什么。我不太明白我到底做了什么。

第 1 行:我知道我在这里创建了一个具有描述符的新对象。这有两个参数,我要排序的列和升序。

第 2 行:这是我感到困惑的行。为什么我需要一个排序描述符数组?当我阅读这段代码时,我怀疑它创建了一个只有一行的数组,对吗?

第 3 行:我知道这是调用 sortUsingDescriptors 方法,但我的困惑是为什么这个函数需要一个数组。

我已经阅读了文档,但我真的在寻找一个简单的解释。

非常感谢任何帮助

【问题讨论】:

    标签: iphone objective-c ios


    【解决方案1】:

    第 1 行:我知道我在这里创建了一个新对象,该对象具有 描述符。这有两个参数,我要排序的列和 它正在上升。

    真的,您已经创建了一个描述符的对象。它描述了如何对数组进行排序。

    第 2 行:这是我感到困惑的行。为什么我需要一个数组 排序描述符?当我阅读此代码时,我怀疑它创建了一个数组 只有一行是正确的吗?

    是的——您已经创建了一个包含单个对象的数组。您可以创建一个包含十个或十五个或八十七个排序描述符的数组,如果您真的想对那么多字段进行排序。更常见的是,你使用一、二,也许是三。因此,如果要对人员列表进行排序,则可以添加指定姓氏和名字的排序描述符。这样,具有相同姓氏的人将根据他们的名字在该组中排列。

    第 3 行:我知道这是调用 sortUsingDescriptors 方法,但我的困惑是为什么这个函数需要一个数组。

    同样,您可以拥有主要、次要、三级(等)排序键。当您只想对一个键进行排序时,您可以有一个单独的方法,该方法采用单个排序描述符而不是数组。 NSArray 没有提供,但如果需要,您可以随时将其添加到类别中:

    @category NSArray (SingleSortDescriptor)
    
    - (NSArray*)sortUsingDescriptor:(NSSortDescriptor*)descriptor;
    
    @end
    
    @implementation NSArray (SingleSortDescriptor)
    
    - (NSArray*)sortUsingDescriptor:(NSSortDescriptor*)descriptor
    {
        return [self sortUsingDescriptors:[NSArray arrayWithObject:descriptor]];
    }
    
    @end
    

    【讨论】:

    • @Caleb :欢迎......我访问了你的个人资料只有一个问题。如何让它看起来像那样?看起来不错。。
    • @anonymous 我不确定你指的是什么,除非它是“关于我”部分中的“天赋”?转到您的个人资料,单击顶部附近的“flair”链接(“edit prefs flair apps...”),然后复制“combined Stack Exchange flair”的 HTML。将其粘贴到您个人资料的“关于我”部分。
    【解决方案2】:

    如果有多个匹配项,将使用多个排序描述符来解决发生的情况。我是优先顺序。如果发现两个标题相同,第二个描述符会告诉它该怎么做。

    【讨论】:

      【解决方案3】:
      • 第 1 行:.. 是的,您的权利。您正在创建一个名为 NSSortDescriptor 的自定义对象。该对象定义了一个要排序的属性。您确实输入了“标题”。因此,要排序的数组中的对象将在该属性之后排序(yourObject.title "kind-of")。

      • 第 2 行:因为排序方法(sortUsingDescriptors)总是需要一个数组,所以你需要创建一个只有一个对象的 NSArray。好吧,...看起来有点愚蠢。但绝对有道理。假设您想按照两个标准进行排序(比如说“标题”,然后是“城市”)。

      • 第 3 行:是的,这里必须是一个数组,因为要根据多个条件进行排序。

      并始终保持内存清洁: 在第 1 行,您确实分配/初始化了一个 NSSortDescriptor。 所以在使用后清理(如果你没有使用ARC)。 所以加一行:

      [newSortDescriptor release];
      

      【讨论】:

      • 我们已经使用 ARC 大约一年了——也许是时候开始假设人们正在使用它,而不是假设他们没有使用它。
      • @JonasSchnelli 有了它,我的 iPhone 3G... :-(
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-14
      • 1970-01-01
      • 1970-01-01
      • 2013-02-03
      • 2012-10-23
      相关资源
      最近更新 更多