我一直在查看 iOS 集合类,并试图找到一个 SortedList。
我想要一个自定义的 Comparer 方法来比较两个对象,类似于 .NET SortedList 类。
我不想在每次需要排序时自己对列表进行排序,我希望找到一个可以传递比较方法二的类,并且每次添加/插入对象时,它都会插入到正确的位置,因此列表总是排序的。
对不起,如果这是一个愚蠢的问题,但 iOS 中有许多不同的集合类。
谢谢您的帮助
我一直在查看 iOS 集合类,并试图找到一个 SortedList。
我想要一个自定义的 Comparer 方法来比较两个对象,类似于 .NET SortedList 类。
我不想在每次需要排序时自己对列表进行排序,我希望找到一个可以传递比较方法二的类,并且每次添加/插入对象时,它都会插入到正确的位置,因此列表总是排序的。
对不起,如果这是一个愚蠢的问题,但 iOS 中有许多不同的集合类。
谢谢您的帮助
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
使用NSMutableArray
. 它的排序方法针对数组已经大部分排序的情况进行了高度优化。它还针对数组已经按相反顺序排序的情况进行了高度优化,或者对通过连接两个排序数组创建的数组进行排序。
NSarray 或 NSMutableArray 可能是您想要使用的存储类型,因为它们具有最容易排序的内部结构。
然后,您应该查看 sortedArrayUsingSelector:@selector(compare:) 方法。
我使用以下代码来实现排序数组: -
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;
}];