Счётчик в то время как внутри, пока не работает - PullRequest
2 голосов
/ 25 июля 2011

У меня странная проблема со следующим кодом:

int c = [whatsNewArray1 count];
int t = [dames count];
int i = 0;
int o= 0;
NSMutableArray *finalWhatsNew = [[NSMutableArray alloc]init];
while (i<c){
    NSLog(@"teller array %i", i);

    while(t>o){
        NSLog(@"dames %i", i);
        if ([[[dames objectAtIndex:o] productId] isEqualToString:[whatsNewArray1 objectAtIndex:i]]){
            [finalWhatsNew addObject:[dames objectAtIndex:o]];
            NSLog(@"inner dames%i", i);
        }
        o++;
    }
    i++;
}

Этот код извлекает все записи из массива "dames", которые указаны в массиве "finalWhatsNew". Проблема в том, что if вызывается только в первый раз.

Чтобы сделать это немного понятнее, весь код работает нормально, но как только "i" становится ++ к 1. оператор if не вызывается. Похоже, я отменяю его после первого раза по причине производительности или чего-то подобного. У кого-нибудь есть идеи?

Thnx !!!

Ответы [ 2 ]

3 голосов
/ 25 июля 2011

После первого завершения внутреннего цикла счетчик o будет равен количеству массива, поэтому он больше не войдет в цикл.Чтобы это работало, вы должны сбрасывать счетчик o на каждой итерации внешнего цикла:

while (i<c){
    o = 0;   
    while (t > o)
    ...

Редактировать : для более ясного кода (и, вероятно, лучшей производительности) вы можете использовать быстрое перечислениевместо обычных циклов for / while:

for (NSString *searchId in whatsNewArray1){
   for (YourObject *obj in dames){
        if ([[obj productId] isEqualToString:searchId])
           [finalWhatsNew addObject: obj];
   }
}

Edit2 : 2-й цикл также можно исключить, используя NSPredicate для фильтрации массива:

for (NSString *searchId in whatsNewArray1){
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"productId == %@",searchId];
     [finalWhatsNew addObjectsFromArray:[dames filteredArrayUsingPredicate:predicate]];
}
2 голосов
/ 25 июля 2011

Как говорит Владимир, вам нужно сбрасывать o после каждой итерации внешнего цикла. В идеале вы переходите на for -статьюмы здесь, так как они точно соответствуют тому, что вы делаете:

for (int i=0; i<c; ++i) {
    // ...
    for (int o=0; o<t; ++o) {
        // ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...