나는 이것에 어떻게 접근 할 것인가에 대한 빠른 예를 하나 넣었지만, 처음에는 기대했던 것보다 더 이상하다고 밝혀졌습니다. 하나의 경우, 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:
을 적절히 구현하므로 비트 맵 표현을 사용합니다. 내 마음에 와서
귀하의 사양에 따라 'asdf'와 'asdfg'가 고유합니까? –
네, 그것들은 유일 할 것입니다. – Rob