我有一个字符串数组,我只想从中提取具有唯一字符集的字符串。 (例如,“asdf”和“fdsa”将被视为冗余)。这是我目前使用的方法:
NSMutableArray *uniqueCharSets = [[NSMutableArray alloc] init];
NSMutableArray *uniqueStrings = [[NSMutableArray alloc] init];
for (NSString *_string in unique) {
NSCharacterSet *_charSet = [NSCharacterSet characterSetWithCharactersInString:_string];
if (![uniqueCharSets containsObject:_charSet]) {
[uniqueStrings addobject:_string];
[uniqueCharSets addObject:_charSet];
}
}
这似乎有效,但它非常缓慢且资源密集。谁能想到更好的方法呢?
答案 0 :(得分:1)
NSDictionary
,将每个字符串的字典排序等效值映射到NSArray
个输入字符串:(例如adfs
=> [afsd, asdf, ...]
)答案 1 :(得分:0)
我只是简单地说明了我将如何处理这个问题,但事实证明它比你最初期望的更奇怪。例如,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:
。
答案 2 :(得分:0)
我唯一想到的就是不使用containsObject
:因为NSMutableArray
没有被排序(通常),我们可以假设containsObject
只是从数组开始迭代直到找到对象为止。这意味着O(n)
(在最坏的情况下n
比较)。
更好的解决方案可能是保持数组的有序性,并使用dichotomic approach使用自定义搜索方法。这样你就会有O(log n)
的复杂性
当然,你必须注意保持你的数组有序(比添加和重新排序更有效),所以你应该使用insertObject:atIndex:
方法正确插入元素。