4

我一直在查看 iOS 集合类,并试图找到一个 SortedList。

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

我不想在每次需要排序时自己对列表进行排序,我希望找到一个可以传递比较方法二的类,并且每次添加/插入对象时,它都会插入到正确的位置,因此列表总是排序的。

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

谢谢您的帮助

4

4 回答 4

3

Foundation 没有保持列表排序的可变集合类。

使用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

于 2014-08-01T15:53:36.470 回答
1

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

于 2014-08-01T16:11:31.327 回答
0

NSarray 或 NSMutableArray 可能是您想要使用的存储类型,因为它们具有最容易排序的内部结构。

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

于 2013-05-10T16:11:47.833 回答
0

我使用以下代码来实现排序数组: -

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;

}];
于 2015-04-17T00:33:29.563 回答