【问题标题】:Quicksort to order array by business key?快速排序按业务键排序数组?
【发布时间】:2023-03-03 18:51:01
【问题描述】:

我有一个对象数组,我无法预测其大小。数组的内容是具有 nsstring 和 nsnumber 类型属性的模型对象。

我需要根据属性之一(nsnumber)对数组进行排序。你会如何在objective-c/Cocoa中做到这一点?实现快速排序或其他算法(哪一个)?有没有可以为您处理的库?

更新 虽然下面的响应是正确的,但它只适用于 10.6,我的目标是 10.5。

【问题讨论】:

    标签: objective-c cocoa arrays sorting quicksort


    【解决方案1】:

    使用 stdlib.h 中的 qsort()

    【讨论】:

    • 如果提问者使用NSArray,stdlib 的qsort() 不会有太大帮助。
    【解决方案2】:

    NSArray 具有several 排序方法。给定您的数组,arr

    NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"numberProperty" ascending:YES];
    NSArray *sortedArr = [arr sortedArrayUsingSortDescriptors:[NSArray arrayWithObject:sortDescriptor]];
    

    会给你一个按@“numberProperty”排序(升序)的数组。显然,您必须将模型对象中的 NSNumber 属性名称替换为 @"numberProperty"

    NSArray的排序方法中没有指定排序算法。

    【讨论】:

    • 我要补充一点,内置排序几乎总是比你可以手动实现的任何东西更有效。在你有铁定证据表明内置排序会变慢之前,你甚至不应该考虑编写自定义排序。
    • 仅在 10.6 中可用,我至少在为 10.5 开发。抱歉没有在我的帖子中提及。
    • 什么?提到的方法都不需要 10.6。多年来,排序一直是 Foundation 的一部分。
    • 也许你指的是 NSSorDescriptor 的便利工厂方法,它是在 10.6 中到达的?只需将其替换为等效的 alloc/initWithKey:ascending:/autorelease。
    【解决方案3】:

    这是我想出的:

    NSArray *unsortedArray = [results allValues];
    NSSortDescriptor *sortDescriptor = [[[NSSortDescriptor alloc] 
                        initWithKey:@"ordinalPosition" 
                          ascending:YES] 
                        autorelease];
    
    NSArray *sortedArray = [unsortedArray 
                           sortedArrayUsingDescriptors:[NSArray arrayWithObject:sortDescriptor]];
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-08
      • 2013-08-25
      • 2020-12-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多