Получить согласованную строку из двух NSArrays - PullRequest
1 голос
/ 25 августа 2011

Как я могу сохранить строку, которая совпадает с одной NSArray с одной разницей в индексе NSMutableArray?

Например, в nsarray есть три "яблока", четыре "ананаса", шесть "бананов", два "какао" и остальные слова не имеют дубликатов, я хотел бы знать, если nsarray имеет как минимум два одинаковых слова Если да, я бы хотел сохранить слова «яблоко», «ананас», «банан» и «какао» один раз в nsmutablearray. Если есть другие похожие слова, я бы тоже хотел добавить их в namutablearray.

Мой код (который все еще не работает должным образом);

NSArray *noWords = [[NSArray alloc] initWithArray:
                          [[NSString stringWithContentsOfFile:[[NSBundle mainBundle] 
                             pathForResource:@"words" ofType:@"txt"]                                               
                             encoding:NSUTF8StringEncoding error:NULL] 
                            componentsSeparatedByString:@"\n"]];

NSUInteger scount = [noWords count];
int ii = 0;
NSString *stringline;
for (ii; ii < scount; ii++)
{
    stringline = [noWords objectAtIndex:ii];
    NSLog(@"stringline : %@ ", stringline);
}
int i = 1;
NSString *line;
for (i ; i < 10; i++)
{
    line = [noWords objectAtIndex:i];
    NSLog (@"line : %@ ", line);

    NSMutableArray *douwords = [NSMutableArray array];

    if ([stringline isEqualToString:line])
    {
        NSString *newword;
        for (newword in douwords)
        {
            [douwords addObject:newword]; 
            NSLog (@"detected! %@ ", douwords);
        }
    }
}

Ответы [ 3 ]

3 голосов
/ 25 августа 2011

Вот решение с использованием двух наборов:

- (NSArray *)getDuplicates:(NSArray *)words
{
    NSMutableSet *dups = [NSMutableSet set],
                 *seen = [NSMutableSet set];

    for (NSString *word in words) {
        if ([seen containsObject:word]) {
            [dups addObject:word];
        }
        [seen addObject:word];
    }

    return [dups allObjects];
}

Предполагая, что NSSet использует хеш-таблицы за кулисами (что я держу пари, что это делает), это будет быстрее, чем ранее предложенный O (n^ 2) решение.

2 голосов
/ 25 августа 2011

Вот что-то необычное:

NSMutableSet* duplicates = [NSMutableSet set];
NSArray* words = [NSArray arrayWithObjects:@"Apple", @"Apple", @"Orange", @"Apple", @"Orange", @"Pear", nil];
[words enumerateObjectsUsingBlock:^(NSString* str, NSUInteger idx, BOOL *stop) {
    for (int i = idx + 1; i < words.count; i++) {
        if ([str isEqualToString:[words objectAtIndex:i]]) {
            [duplicates addObject:str];
            break;
        }
    }
}];
NSLog(@"Dups: %@", [duplicates allObjects]); // Prints "Apple" and "Orange"

Использование NSSet, в отличие от NSArray, гарантирует, что строки добавляются не более одного раза.Очевидно, что есть оптимизации, которые можно сделать, но это должно стать хорошей отправной точкой.

1 голос
/ 26 августа 2011

Я предполагаю, что вы хотите посчитать количество слов в вашем массиве и вывести те, у которых число больше одного. Основной и многословный способ сделать это будет:

// Make an array of words - some duplicates
NSArray *wordList = [[NSArray alloc] initWithObjects:
                    @"Apple", @"Banana", @"Pencil",
                    @"Steve Jobs", @"Kandahar",
                    @"Apple", @"Banana", @"Apple",
                    @"Pear", @"Pear", nil];

// Make an mutable dictionary - the key will be a word from the list
// and the value will be a number representing the number of times the
// word appears in the original array. It starts off empty.
NSMutableDictionary *wordCount = [[NSMutableDictionary alloc] init];

// In turn, take each word in the word list...
for (NSString *s in wordList) {

    int count = 1;

    // If the word is already in the dictionary
    if([wordCount objectForKey:s]) {

        // Increse the count by one
        count = [[wordCount objectForKey:s] intValue] + 1;

    }

    // Save the word count in the dictionary
    [wordCount setObject:[NSNumber numberWithInt:count] forKey:s];
}

// For each word...
for (NSString *s in [wordCount keysOfEntriesPassingTest:
                     ^(id key, id obj, BOOL *stop) {
                         if ([obj intValue] > 1) return YES; else return NO;
                     }]) {

    // print the word and the final count
    NSLog(@"%2d %@", [[wordCount objectForKey:s] intValue], s);

}

Вывод будет:

3 Apple
2 Pear
2 Banana
...