如何将NSArray的字符串转换为一个唯一字符串数组,顺序相同?

can*_*boy 27 iphone objective-c nsarray nsset ios

如果您有一个NSArray字符串

{ @"ONE", @"ONE", @"ONE", "TWO", @"THREE", @"THREE" }
Run Code Online (Sandbox Code Playgroud)

我怎么会把它变成

{ @"ONE", @"TWO", @"THREE" }
Run Code Online (Sandbox Code Playgroud)

..数组遵循与原始数据相同的顺序.我认为您可以将数组转换为NSSet以获取唯一的项目,但如果您将其转换回数组,则无法保证获得相同的顺序.

Dav*_*ong 49

我最初的想法是你可以这样做:

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

但这并没有维持秩序.因此,您必须手动执行此操作:

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];
  }
}
Run Code Online (Sandbox Code Playgroud)

我用的NSMutableSet确定,如果我之前已经碰到过这样的条目(而不是[unique containsObject:string],因为一组将有O(1)查找时间,以及阵列具有O(n)的查找时间.如果你只处理对象的数量少,那么这并不重要.但是,如果源数组是非常大的,然后使用一组确定的唯一性会增加一点速度提升的.(但是,你应该使用仪器来分析代码看看是否有必要)


San*_*gam 48

你可以这样做:

NSArray * uniqueArray = [[NSOrderedSet orderedSetWithArray:duplicatesArray] array];
Run Code Online (Sandbox Code Playgroud)

这样,您还可以保留订单!

  • 这是正确的但它应该是NSArray*uniqueArray = [[NSOrderedSet orderedSetWithArray:duplicatesArray] allObjects] (3认同)

ume*_*yan 6

我认为你可以做到这一点

NSArray * uniqueArray = [[Yourarray valueForKeyPath:@"@distinctUnionOfObjects.self"] sortedArrayUsingSelector:@selector(caseInsensitiveCompare:)];
Run Code Online (Sandbox Code Playgroud)

我希望这会对你有所帮助