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