मैंने अभी एक त्वरित उदाहरण दिया है कि मैं इस पर कैसे पहुंचूंगा, लेकिन यह पता चला है कि यह पहले की तुलना में अधिक अजीब है। एक के लिए, NSCharacterSet
सामग्री की जांच के लिए समानता लागू नहीं करता है। यह केवल सूचक मूल्य का उपयोग करता है। इस पर आधारित आपका उदाहरण ठीक से काम नहीं करेगा।
मेरा दृष्टिकोण हमारे लिए इन्हें हैशिंग से निपटने के लिए एनएसएससेट का उपयोग करना है।
@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:
लागू करता है।
स्रोत
2012-01-02 00:29:55
आपके spec के अनुसार 'asdf' और 'asdfg' अद्वितीय हैं? –
हां, वे अद्वितीय होंगे। – Rob