Po prostu połączyłem szybki przykład tego, jak do tego podejść, ale okazuje się, że jest bardziej, dziwnie, niż się spodziewasz. Po pierwsze, NSCharacterSet
nie wprowadza równości w celu sprawdzenia zawartości. Używa tylko wartości wskaźnika. Na tej podstawie Twój przykład NIE będzie działał prawidłowo.
Moje podejście polega na wykorzystaniu NSSet do radzenia sobie z tym hashowaniem.
@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;
}
Kod jest dość prosty. Tworzymy obiekt kontenera, aby buforować wyniki reprezentacji bitmap zestawu znaków. Używamy reprezentacji bitmap, ponieważ NSData
implementuje odpowiednio: isEqual:
.
są "asdf" i "asdfg" unikalne zgodnie z twoją specyfikacją? –
Tak, byłyby unikatowe. – Rob