2

我一定是有什么奇怪的误解……

考虑:

NSSet * mySet = [NSSet setWithArray:@[@1, @9, @3]] ;
NSOrderedSet * mySortedSet = [NSOrderedSet orderedSetWithSet:mySet] ;

for (NSNumber * n in mySet) {
    NSLog(@"unsorted: %@", n) ;
}
for (NSNumber * n in mySortedSet) {
    NSLog(@"--sorted: %@", n) ;
}

和控制台日志:

2014-05-05 20:38:46.645 WoGa[50557:60b] unsorted: 9
2014-05-05 20:38:48.675 WoGa[50557:60b] unsorted: 1
2014-05-05 20:38:49.875 WoGa[50557:60b] unsorted: 3
2014-05-05 20:38:54.277 WoGa[50557:60b] --sorted: 9
2014-05-05 20:38:55.544 WoGa[50557:60b] --sorted: 1
2014-05-05 20:38:56.684 WoGa[50557:60b] --sorted: 3

嗯?那是如何“订购”的?如果需要,我对自己进行排序没有问题,但是 NSOrderedSet 到底是什么?

我可以接受元素的顺序mySet是不可预测的。但是如果不按某种顺序排序[NSOrderedSet orderedSetWithSet:mySet]应该达到什么目的呢?

从文档中:

当元素的顺序很重要并且测试对象是否包含在集合中的性能是一个考虑因素时,您可以使用有序集合作为数组的替代方案——测试数组的成员资格比测试集合的成员资格慢。

同样,NSOrderedSet orderedSetWithSet:应该为您提供什么命令?

4

1 回答 1

3

您混淆了“有序”和“排序”。数组是一个有序集合,这意味着它有第一个、第二个、第三个,直到最后一个元素。集合或字典是无序的集合,没有元素的排序。没有第一个或最后一个元素。

NSOrderedSet 结合了 NSSet 和 NSArray 的属性。与数组一样,您可以在末尾添加元素或将它们插入数组中的任何位置,或从任何位置删除元素,或对元素进行排序。与 NSSet 一样,您可以在恒定时间内查找元素是否已经存在。

有序集合可以排序,但不会自动排序。无序集合无法排序,因为它们没有排序。

另一方面,您可能刚刚阅读了 NSOrderedSet 的文档,这一切都非常清楚。

于 2014-05-05T19:59:15.733 回答