これにどのようにアプローチするかの簡単な例をまとめましたが、最初に予想したよりも奇妙であることがわかりました。1NSCharacterSet
つには、コンテンツをチェックするための等価性を実装していません。ポインター値のみを使用します。これに基づいて、あなたの例は正しく機能しません。
私のアプローチは、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:
ます。