我只是整理了一个简单的例子来说明我将如何处理这个问题,但事实证明它比你最初预期的更奇怪。一方面,NSCharacterSet
不实施平等来检查内容。它只使用指针值。基于此,您的示例将无法正常工作。
我的方法是使用 NSSet 为我们处理这些哈希。
@interface StringWrapper : NSObject
@property (nonatomic, copy) NSString *string;
@property (nonatomic, copy) NSData *charSetBitmap;
- (id)initWithString:(NSString*)aString;
@end
@implementation StringWrapper
@synthesize string, charSetBitmap;
- (id)initWithString:(NSString*)aString;
{
if ((self = [super init]))
{
self.string = aString;
}
return self;
}
- (void)setString:(NSString *)aString;
{
string = [aString copy];
self.charSetBitmap = [[NSCharacterSet characterSetWithCharactersInString:aString] bitmapRepresentation];
}
- (BOOL)isEqual:(id)object;
{
return [self.charSetBitmap isEqual:[object charSetBitmap]];
}
- (NSUInteger)hash;
{
return [self.charSetBitmap hash];
}
@end
int main (int argc, const char * argv[])
{
@autoreleasepool {
NSMutableSet *stringWrappers = [[NSMutableSet alloc] init];
NSArray *strings = [NSArray arrayWithObjects:@"abc",@"aaabcccc",@"awea",@"awer",@"abcde", @"ehra", @"QWEQ", @"werawe", nil];
for (NSString *str in strings)
[stringWrappers addObject:[[StringWrapper alloc] initWithString:str]];
NSArray *uniqueStrings = [stringWrappers valueForKey:@"string"];
NSLog(@"%@", uniqueStrings);
}
return 0;
}
代码非常简单。我们创建一个容器对象来缓存字符集位图表示的结果。我们使用位图表示是因为NSData
实现isEqual:
得当。