iOS如何使用排序列表?

问题描述:

我一直在寻找iOS的集合类,我试图找到一个排序列表。iOS如何使用排序列表?

我想有一个自定义Comparer方法来比较两个对象,类似于.NET SortedList类。

我不希望自己每次我需要它有序,我希望能找到,我可以通过一个比较方法二,我每次添加/时间一类插入它被插入正确的对象时排序列表所以该列表总是被排序。

对不起,如果这是一个愚蠢的问题,但iOS中有许多不同的集合类。

感谢您的帮助

+0

做一个列表,并对其进行排序。 NSArray/NSMutableArray是标准列表,它有许多不同的排序选项。 – 2013-05-10 16:10:17

的NSArray或NSMutableArray中很可能要使用的存储类型,因为它们最容易被分类的内部结构。

然后,您应该查看sortedArrayUsingSelector:@selector(compare :)方法。

+1

请注意,一个NSMutableArray允许插入和删除,并且编写一点代码(甚至可以是NSMutableArray上的“类别”)以使用二进制搜索在适当的位置插入新值,这是一个相对适中的编程工作。 – 2013-05-10 16:23:51

+0

是的,维护一个已排序的结构然后反复重复会更有效率。 – ChrisCM 2013-05-10 16:25:52

+1

根据数组中的对象数量和所需的响应时间,每次都可以采取行动。如果你没有很多项目需要排序,或者如果你不减少毫秒来获得UI响应,这是一个无代码的解决方案。如果需要的话首先测量。过早优化是所有邪恶的根源.... – stevekohls 2013-05-10 17:59:38

基金会没有可变的集合类来保持列表排序。

使用NSMutableArray及其-insertObject:atIndex:添加对象。使用-indexOfObject:inSortedRange:options:usingComparator:确定正确的索引。

从NSArray的参考:

如果指定了NSBinarySearchingInsertionIndex选项,返回时,你应该以保持有序阵列插入obj中的指标:

  • 如果发现OBJ并且既没有指定NSBinarySearchingFirstEqual也没有指定NSBinarySearchingLastEqual, 返回任何等于或大于任何匹配对象的 索引的较大索引。
  • [...]
  • 如果找不到该对象,如果该对象是比所有其他元素放大返回 的至少所述指数大于对象,或在 数组的末尾的索引。

特别注意事项:数组中的元素必须已经使用比较CMP了排序 。如果数组未排序,则结果为未定义的 。

你的类中的方法可以是这样的:

- (void)ymy_insertSortedObject:(id)obj 
{ 
    NSUInteger insertionIndex = [self indexOfObject:obj 
             inSortedRange:NSMakeRange(0, self.count) 
              options:NSBinarySearchingInsertionIndex 
            usingComparator:^(id obj1, id obj2){ 
     return [obj1 compare:obj2]; 
    }]; 
} 

编辑:这里有一个下拉类别中,您可以使用:NSMutableArray+YMYSorted.h

使用NSMutableArray。其排序方法针对数组已经大部分排序的情况进行了高度优化。它也针对数组已经按照相反顺序排序的情况进行了高度优化,或者对通过连接两个排序数组创建的数组进行排序。

我用下面的代码,以达到有序数组: -

NSArray *sortedArray = [array sortedArrayUsingComparator: ^(id obj1, id obj2) { 



if ([obj1 integerValue] > [obj2 integerValue]) { 

     return (NSComparisonResult)NSOrderedDescending; 

} 



if ([obj1 integerValue] < [obj2 integerValue]) { 

     return (NSComparisonResult)NSOrderedAscending; 

} 

return (NSComparisonResult)NSOrderedSame; 

}];