如果你有一个字符串的 NSArray
{ @"ONE", @"ONE", @"ONE", "TWO", @"THREE", @"THREE" }
我怎么把它变成
{ @"ONE", @"TWO", @"THREE" }
..数组遵循与原始相同的顺序。我认为您可以将数组转换为 NSSet 以获取唯一项目,但如果您将其转换回数组,则不能保证获得相同的顺序。
如果你有一个字符串的 NSArray
{ @"ONE", @"ONE", @"ONE", "TWO", @"THREE", @"THREE" }
我怎么把它变成
{ @"ONE", @"TWO", @"THREE" }
..数组遵循与原始相同的顺序。我认为您可以将数组转换为 NSSet 以获取唯一项目,但如果您将其转换回数组,则不能保证获得相同的顺序。
我最初的想法是你可以这样做:
NSArray * a = [NSArray arrayWithObjects:@"ONE", @"ONE", @"ONE", @"TWO", @"THREE", @"THREE", nil];
NSLog(@"%@", [a valueForKeyPath:@"@distinctUnionOfObjects.self"]);
但这并不能维持秩序。因此,您必须手动执行此操作:
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];
}
}
我使用 anNSMutableSet
来确定我之前是否已经遇到过此条目(而不是[unique containsObject:string]
,因为集合将具有 O(1) 查找时间,而数组具有 O(n) 查找时间。如果您只处理少量的对象,那么这无关紧要。但是,如果源数组非常大,那么使用集合来确定唯一性可能会增加一点速度。(但是,您应该使用 Instruments 来分析您的代码看看有没有必要)
你可以这样做:
NSArray * uniqueArray = [[NSOrderedSet orderedSetWithArray:duplicatesArray] array];
这样,您还可以保留订单!
我认为你可以这样做
NSArray * uniqueArray = [[Yourarray valueForKeyPath:@"@distinctUnionOfObjects.self"] sortedArrayUsingSelector:@selector(caseInsensitiveCompare:)];
我希望这会对你有所帮助
Hmm.. you could just use a loop ?
NSMutableArray *newarray = [[NSMutableArray alloc] init];
NSString *laststring = nil;
for (NSString *currentstring in oldarray)
{
if (![currentstring isEqualtoString:laststring]) [newarray addObject:currentstring];
laststring = currentstring
}
这是一个很好的类别,它定义了一个自定义运算符,例如@distinctUnionOfObjects
,除了它只适用于字符串并且它将保持它们的原始顺序。注意:它不会为您对字符串进行排序。它只保留重复字符串的第一个实例。
用法:
#import "NSArray+orderedDistinctUnionOfStrings.h"
...
// if you feed it an array that has already been ordered, it will work as expected
NSArray *myArray = @[@"ONE", @"ONE", @"ONE", @"TWO", @"THREE", @"THREE"];
NSArray *myUniqueArray = [myArray valueForKeyPath:@"@orderedDistinctUnionOfStrings.self"];
输出:
myUniqueArray = ( "ONE", "TWO", "THREE" )
.h 文件:
#import <Foundation/Foundation.h>
@interface NSArray (orderedDistinctUnionOfStrings)
@end
.m 文件:
#import "NSArray+orderedDistinctUnionOfObjects.h"
@implementation NSArray (orderedDistinctUnionOfObjects)
- (id) _orderedDistinctUnionOfStringsForKeyPath:(NSString*)keyPath {
NSMutableIndexSet *removeIndexes = [NSMutableIndexSet indexSet];
for (NSUInteger i = 0, n = self.count; i < n; ++i) {
if ([removeIndexes containsIndex:i]) {
continue;
}
NSString *str1 = [[self objectAtIndex:i] valueForKeyPath:keyPath];
for (NSUInteger j = i+1; j < n; ++j) {
if ([removeIndexes containsIndex:j]) {
continue;
}
id obj = [self objectAtIndex:j];
NSString *str2 = [obj valueForKeyPath:keyPath];
if ([str1 isEqualToString:str2]) {
[removeIndexes addIndex:j];
}
}
}
NSMutableArray *myMutableCopy = [self mutableCopy];
[myMutableCopy removeObjectsAtIndexes:removeIndexes];
return [[NSArray arrayWithArray:myMutableCopy] valueForKeyPath:[NSString stringWithFormat:@"@unionOfObjects.%@", keyPath]];
}
@end
这里是关于如何生成自己的运算符的优秀读物,并(稍微)揭开它的神秘面纱:http: //bou.io/KVCCustomOperators.html