2011-07-25 11 views
2

を働いていないながら、内:カウンター、私は次のコードで奇妙な問題を抱えている

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++; 
} 

このコードはアル「finalWhatsNew」の配列に記載されている「貴婦人」のアレイからエントリを取得。この問題は、ifが初めて呼び出されるということです。

もう少し明確にするために、コード全体が正常に動作していますが、すぐに「i」は++から1になります。if文は呼び出されません。それはパフォーマンスの理由やそのような何かのための最初の後に私はそれをキャンセルするように見えます。誰にでもアイデアはありますか?

Thnx !!!

+0

'whatsNewArray1'にはいくつのオブジェクトがありますか?何が起こっているのかを理解し、出力を投稿するために、いくつかのNSLogステートメントを追加できますか? – sergio

答えて

3

内部ループが最初に終了した後、oカウンタはアレイのカウントと等しくなり、ループに再び入りません。

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

編集:それを動作させるために、あなたは、外側のループの各反復でoカウンタをリセットしなければならない明確なコード(そしておそらくより良い性能)のためには、のために/ whileループの代わりに、通常の高速な列挙を使用することができます。

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

EDIT2:また、あなたはあなたの配列をフィルタリングするNSPredicateを使用して第二のループを解消することができます

for (NSString *searchId in whatsNewArray1){ 
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"productId == %@",searchId]; 
    [finalWhatsNew addObjectsFromArray:[dames filteredArrayUsingPredicate:predicate]]; 
} 
+0

すごい! Thnxはこれがうまくいった – Jos

2

Vladimir氏によれば、外側ループの各繰り返しの後にoをリセットする必要があります。理想的には、ここでforの文章に切り替えることができます。

for (int i=0; i<c; ++i) { 
    // ... 
    for (int o=0; o<t; ++o) { 
     // ... 
関連する問題