Что случилось с моей простой петлей? - PullRequest
1 голос
/ 27 ноября 2011
NSMutableArray *noDup = [[NSMutableArray alloc]init];
NSMutableArray *dup = [[NSMutableArray alloc]init];

for (NSString *first in newsmall)
{
    BOOL hasfound = NO;
    //NSLog (@"first %@", first);

    for (NSString *second in newbig) 
    {
        //NSLog (@"second %@", second);
        if ([second isEqualToString:first])
        {
            [dup addObject:first];
            hasfound = YES;
            break;
        }
    }

    if (!hasfound)
    {
        //NSLog (@"has not found %@", first);
        [noDup addObject:first];
    }
}

newsmall - это небольшой массив только строк, а newbig - это большой массив только строк. Приложение отключается без предупреждения отладки. NSLog показал «первый» и «второй», но не «не нашел». Как получилось?

Ответы [ 2 ]

3 голосов
/ 27 ноября 2011

О, даааа. Теперь я понимаю вашу проблему.

Обратный порядок, в котором сравниваются ваши массивы. Если вы хотите узнать, какие строки в newbig не существуют в newsmall, сначала переберите newbig, чтобы посмотреть, какое перечисленное слово в newbig существует в newsmall.

Код выглядит следующим образом (изменились только две строки кода):

NSMutableArray *noDup = [[NSMutableArray alloc]init];
NSMutableArray *dup = [[NSMutableArray alloc]init];

for (NSString *first in newbig)
{
    BOOL hasfound = NO;
    //NSLog (@"first %@", first);

    for (NSString *second in newsmall) 
    {
        //NSLog (@"second %@", second);
        if ([second isEqualToString:first])
        {
            [dup addObject:first];
            hasfound = YES;
            break;
        }
    }

    if (!hasfound)
    {
        //NSLog (@"has not found %@", first);
        [noDup addObject:first];
    }
}

Видите тонкую разницу?

0 голосов
/ 27 ноября 2011

Ваш внутренний цикл может быть заменен методом containsObject: следующим образом:

for (NSString *first in newbig) {
    if ([newsmall containsObject:first]) {
        [dup addObject:first];
    } else {
        [noDup addObject:first];
    }
}

Кроме того, преобразование newsmall в NSSet увеличит скорость.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...