How to turn an NSArray of strings into an array of unique strings, in the same order?

前端 未结 5 2020
我在风中等你
我在风中等你 2020-12-23 17:34

If you have an NSArray of strings

{ @\"ONE\", @\"ONE\", @\"ONE\", \"TWO\", @\"THREE\", @\"THREE\" }

How would I turn that into

<         


        
5条回答
  •  别那么骄傲
    2020-12-23 17:59

    My initial thought was that you could do:

    NSArray * a = [NSArray arrayWithObjects:@"ONE", @"ONE", @"ONE", @"TWO", @"THREE", @"THREE", nil];
    NSLog(@"%@", [a valueForKeyPath:@"@distinctUnionOfObjects.self"]);
    

    But that does not maintain order. Therefore, you have to do it manually:

    NSArray * a = [NSArray arrayWithObjects:@"ONE", @"ONE", @"ONE", @"TWO", @"THREE", @"THREE", nil];
    NSMutableArray * unique = [NSMutableArray array];
    NSMutableSet * processed = [NSMutableSet set];
    for (NSString * string in a) {
      if ([processed containsObject:string] == NO) {
        [unique addObject:string];
        [processed addObject:string];
      }
    }
    

    I use an NSMutableSet for determining if I've already come across this entry before (as opposed to [unique containsObject:string], since a set will have O(1) lookup time, and an array has O(n) lookup time. If you're only dealing with a small number of objects, then this won't matter. However, if the source array is very large, then using the set to determine uniqueness may add a bit of a speed boost. (however, you should use Instruments to profile your code and see if it's necessary)

提交回复
热议问题