是否可以轻松检查数组是否按Objective-C排序?如果没有,是什么';这是“什么?”;“最佳做法”;我一个人怎么做?

是否可以轻松检查数组是否按Objective-C排序?如果没有,是什么';这是“什么?”;“最佳做法”;我一个人怎么做?,objective-c,arrays,sorting,Objective C,Arrays,Sorting,我知道在创建数组时可以使用NSSortDescriptor对数组进行排序,但是是否有一种预构建的方法来获取已经存在的数组并判断它是否已经排序 如果没有,我可以想出两种方法自己做: 密码输入 从旧阵列创建新阵列,但在创建新阵列时使用NSSortDescriptor,然后检查两个阵列是否相等 我的代码优化有点生疏,那么这两种方法中哪一种更好(更快/最稳定)?或者有没有其他方法比这两种方法都好?您提到的问题表明算法是O(n),并且尽可能快。总的来说,分拣的成本总是比这要高;使用一些算法,例如冒泡排序,

我知道在创建数组时可以使用NSSortDescriptor对数组进行排序,但是是否有一种预构建的方法来获取已经存在的数组并判断它是否已经排序

如果没有,我可以想出两种方法自己做:

  • 密码输入
  • 从旧阵列创建新阵列,但在创建新阵列时使用NSSortDescriptor,然后检查两个阵列是否相等

  • 我的代码优化有点生疏,那么这两种方法中哪一种更好(更快/最稳定)?或者有没有其他方法比这两种方法都好?

    您提到的问题表明算法是O(n),并且尽可能快。总的来说,分拣的成本总是比这要高;使用一些算法,例如冒泡排序,仅当且仅当输入已排序时才取O(n)

    因此,你的建议(1)总是会胜过你的建议(2),因为后者是排序的成本加上相等测试的成本,相等测试本身就是O(n)


    如果您有一个可变数组,并且希望维护它是否已排序,则在排序时设置一个标志,并在任何添加时重置该标志。

    这里的另一个方法是将NSMutableArray子类化,该子类将具有BOOL sorted属性,您将在对数组排序时设置该属性

    如果不想子类化,可以在数组上设置一个键,指示相同的内容,然后如果传递它,它将保留在数组中

    // create array
    NSMutableArray* array = [NSMutableArray arrayWithCapacity:1];
    [array setValue:NO forKey:@"sorted"];
    
    //... insert values
    //... sort
    
    // check if sorted
    BOOL sorted = [array valueForKey:@"sorted"];
    
    // add a new value to the array
    [array addObject:obj];
    [array setValue:NO forKey:@"sorted"];
    

    您最好的选择是,只要您希望得到保证,就可以随时对其进行重新排序,或者使用带有标志的自定义集合对象来包括它是否已排序(当您知道它已排序时,您可以自行设置)。感谢您的详细解释。我知道有时候内置的算法比你自己用简单的方式编码要快,但在这种情况下,简单的方式听起来是最好的。我一直在思考我的具体问题,在这个例子中,我将从一个数据库中读取数据并将其放入我的数组中,然后它再也不会改变,所以我将确保在读取数据时对其进行排序,这样我会做得很好。当我对数组没有太多的控制权时,您的答案仍然是很好的参考。这个答案有两个主要问题:子类化是一个非常糟糕的想法,因为NSMutableArray是一个类集群,而不是一个具体的类。至少可以说,子类化是很困难的,文档中也极力反对这种做法。此外,您不能在NSMutableArray上执行
    setValue:forKey:
    ;你想的是NSMUTABLE字典。(虽然NSMutableArray确实支持setVale:forKey:(来自NSObject)它并没有做你认为的事情:它在数组中的所有对象上调用该方法。)研究了这个,你已经死定了,我没有意识到可变数组上的keyvalue协议的行为。谢谢你的更正。