引用:http://www.cnblogs.com/someonelikeyou/p/5795090.html
#####结论:原序去重用 NSOrderedSet 或 NSMutableArray1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132- (void)testDistinctEfficiencyForArray {
NSArray *pointArray = @[[NSValue valueWithCGPoint:CGPointMake(1, 1)],
[NSValue valueWithCGPoint:CGPointMake(1, 1)],
[NSValue valueWithCGPoint:CGPointMake(2, 2)],
[NSValue valueWithCGPoint:CGPointMake(3, 3)],
[NSValue valueWithCGPoint:CGPointMake(3, 3)],
[NSValue valueWithCGPoint:CGPointMake(2, 2)],
[NSValue valueWithCGPoint:CGPointMake(4, 4)],
[NSValue valueWithCGPoint:CGPointMake(3, 3)],
[NSValue valueWithCGPoint:CGPointMake(5, 5)],
[NSValue valueWithCGPoint:CGPointMake(4, 4)]];
NSArray *numberArray = @[@1,@1,@2,@1,@3,@4,@3,@5,@1,@5];
for (NSInteger i = 0; i < 18; i ++) {
numberArray = [numberArray arrayByAddingObjectsFromArray:numberArray];
pointArray = [pointArray arrayByAddingObjectsFromArray:pointArray];
}
//numberArray.count = 2621440
NSLog(@"numberArray.count = %ld", numberArray.count);
//pointArray.count = 2621440
NSLog(@"pointArray.count = %ld", pointArray.count);
/////////////////////- 以下是 numbers 去重 -/////////////////////////
//原序, time = 0.492623, NSMutableArray 去重结果: 12345,
[self distinctItemsUsingMutableArrayForArray:numberArray];
//乱序, time = 0.803937, NSArray distinctUnionOfObjects.self 去重结果: 32514 ,
[self distinctItemsUsingArrayKVCForArray:numberArray];
//乱序, time = 0.121862, NSMutableDictionary 去重结果: 32514 ,
[self distinctItemsUsingMutableDictionaryForArray:numberArray];
//乱序, time = 0.108073, NSSet 去重结果: 32514 ,
[self distinctItemsUsingSetForArray:numberArray];
//原序, time = 0.132699, NSOrderedSet 去重结果:12345,
[self distinctItemsUsingOrderedSetForArray:numberArray];
//乱序, time = 0.110322, NSSet+distinctUnionOfObjects.self 去重结果:32514,
[self distinctItemsUsingSetKVCForArray:numberArray];
/////////////////////- 以下是 Points 去重 -/////////////////////////
//原序, time = 0.385306, NSMutableArray 去重结果: {1,1} {2,2} {3,3} {4,4} {5,5} ,
[self distinctItemsUsingMutableArrayForArray:pointArray];
//原序, time = 1.211656, NSArray distinctUnionOfObjects.self 去重结果: {1,1} {2,2} {3,3} {4,4} {5,5} ,
[self distinctItemsUsingArrayKVCForArray:pointArray];
//原序, time = 0.565697, NSMutableDictionary 去重结果: {1,1} {2,2} {3,3} {4,4} {5,5} ,
[self distinctItemsUsingMutableDictionaryForArray:pointArray];
//原序, time = 0.393808, NSSet 去重结果: {1,1} {2,2} {3,3} {4,4} {5,5} ,
[self distinctItemsUsingSetForArray:pointArray];
//原序, time = 0.492740, NSOrderedSet 去重结果: {1,1} {2,2} {3,3} {4,4} {5,5} ,
[self distinctItemsUsingOrderedSetForArray:pointArray];
//原序, time = 0.419985, NSSet+distinctUnionOfObjects.self 去重结果: {1,1} {2,2} {3,3} {4,4} {5,5} ,
[self distinctItemsUsingSetKVCForArray:pointArray];
}
- (void)distinctItemsUsingMutableArrayForArray:(NSArray *)array {
NSDate *dateOrigin = [NSDate date];
NSMutableArray *resultArray = [NSMutableArray array];
for (NSNumber *num in array) {
if ([resultArray containsObject:num] == NO) {
[resultArray addObject:num];
}
}
NSLog(@"NSMutableArray: %lf", [[NSDate date] timeIntervalSinceDate:dateOrigin]);
NSLog(@"result NSArray = %@", resultArray);
}
- (void)distinctItemsUsingArrayKVCForArray:(NSArray *)array {
//KVC容器操作
//容器不仅仅能使用KVC方法实现对容器成员传递普通的操作消息,KVC还定义了特殊的一些常用操作,使用valueForKeyPath:结合操作符来使用
//这里使用对象操作符:
//@distinctUnionOfObjects、@unionOfObjects
//@distinctUnionOfObjects操作符返回被操作对象指定属性的集合并做去重操作,而@unionOfObjects则允许重复。如果其中任何涉及的对象为nil,则抛出异常。
NSDate *dateOrigin = [NSDate date];
NSArray *resultArray = [array valueForKeyPath:@"@distinctUnionOfObjects.self"];
NSLog(@"NSArray distinctUnionOfObjects.self: %lf", [[NSDate date] timeIntervalSinceDate:dateOrigin]);
NSLog(@"values NSArray = %@", resultArray);
}
- (void)distinctItemsUsingMutableDictionaryForArray:(NSArray *)array {
NSDate *dateOrigin = [NSDate date];
NSMutableDictionary *numDictionary = [NSMutableDictionary dictionary];
for (NSNumber *num in array) {
[numDictionary setObject:num forKey:num];
}
NSArray *resultArray = numDictionary.allKeys;
NSLog(@"NSMutableDictionary: %lf", [[NSDate date] timeIntervalSinceDate:dateOrigin]);
NSLog(@"numDictionary.allKeys NSArray: %@", resultArray);
}
- (void)distinctItemsUsingSetForArray:(NSArray *)array {
NSDate *dateOrigin = [NSDate date];
NSSet *numSet = [NSSet setWithArray:array];
NSArray *resultArray = numSet.allObjects;
NSLog(@"NSSet: %lf", [[NSDate date] timeIntervalSinceDate:dateOrigin]);
NSLog(@"numSet.allObjects NSArray : %@", resultArray);
}
- (void)distinctItemsUsingOrderedSetForArray:(NSArray *)array {
NSDate *dateOrigin = [NSDate date];
NSOrderedSet *orderNumSet = [NSOrderedSet orderedSetWithArray:array];
NSArray *resultArray = orderNumSet.array;
NSLog(@"NSOrderedSet: %lf", [[NSDate date] timeIntervalSinceDate:dateOrigin]);
NSLog(@"orderNumSet.array NSArray : %@", resultArray);
}
- (void)distinctItemsUsingSetKVCForArray:(NSArray *)array {
//KVC 容器对象操作符 distinctUnionOfObjects
NSDate *dateOrigin = [NSDate date];
NSSet *aSet = [[NSSet alloc] initWithArray:array];
NSSet *setValues = [aSet valueForKeyPath:@"@distinctUnionOfObjects.self"];
NSLog(@"NSSet+distinctUnionOfObjects.self: %lf", [[NSDate date] timeIntervalSinceDate:dateOrigin]);
NSLog(@"setValues NSSet: %@", setValues);
}