6

文字列の配列があり、そこから一意の文字セットを持つものだけを抽出したいと考えています。(たとえば、「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];
    }
}

これは機能しているように見えますが、非常に遅く、リソースを大量に消費します。誰でもこれを行うためのより良い方法を考えることができますか?

4

3 に答える 3

1
  1. を使用してNSDictionary、各文字列の辞書順でソートされた等価物をNSArray入力文字列の にマップします: (例adfs=> [afsd, asdf, ...])
  2. ディクショナリを調べて、単一要素の配列値のみを持つキー (またはその値) を出力します。
于 2012-01-02T01:02:33.927 に答える
0

これにどのようにアプローチするかの簡単な例をまとめましたが、最初に予想したよりも奇妙であることがわかりました。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:ます。

于 2012-01-02T00:29:55.657 に答える
0

私の頭に浮かぶ唯一のことは、を使用しないことcontainsObjectです:は順序付けられていないため (一般に)、オブジェクトが見つかるまで配列を最初から反復するだけNSMutableArrayであると想定できます。containsObjectこれはO(n)(n最悪の場合は比較 ) を意味します。

より良い解決策は、配列の順序を維持し、二分法によるカスタム検索方法を使用することです。このようにO(log n) 複雑になります。
もちろん、配列の順序を維持するように注意する必要があるため (追加や並べ替えよりもはるかに効率的です)、insertObject:atIndex:メソッドを使用して要素を適切に挿入する必要があります。

于 2012-01-02T00:39:09.990 に答える