2011-07-17 11 views
0

N要素のNSMutable配列を持っています。各要素はまた、k個のNSNumberのNSMutable配列です。言い換えれば、可変長の列を持つ表。各列が可変長のn列からn要素を選択する方法を列挙します。

列ごとに1つの要素を選択するためのすべての可能な方法を含む新しい配列を生成する必要があります。

例:

1 1 1 1 1 1 
2   2 

結果:

1 1 1 1 1 1 
2 1 1 1 1 1 
1 1 1 1 1 2 
2 1 1 1 1 2 

答えて

0

次のメソッドは、[0,0,...,0]で始まる、あなたが取るしたい可能列のインデックスを反復します:

-(NSMutableArray *)nextIndex:(NSMutableArray *)prevIndex { 
    NSMutableArray newIndex = [NSMutableArray arrayWithArray:prevIndex]; 
    int numCols = [bigArray count]; 
    for (int i=numCols-1; i>=0; --i) { 
     if ([[prevIndex objectAtIndex:i] intValue] < [[bigArray objectAtIndex:i] count]-1) { 
      [newIndex replaceObjectAtIndex:i withObject:[NSNumber numberWithInt:[[prevIndex objectAtIndex:i] intValue]+1]]; 
      for (int j=i+1; j<numCols; ++j) { 
       [newIndex replaceObjectAtIndex:j withObject:[NSNumber numberWithInt:0]]; 
      } 
      return newIndex; 
     } 
    } 
    return nil; 
} 

へこれらの行に沿って何かをしてください:

-(NSMutableArray*)matrixArray { 
    NSMutableArray *matrix = [[NSMutableArray alloc] init]; 
    NSMutableArray *index = [[NSMutableArray alloc] init]; 
    NSMutableArray *values = [[NSMutableArray alloc] init]; 
    int numCols = [bigArray count]; 
    for (int i=0; i<numCols; ++i) { 
     [index addObject:[NSNumber numberWithInt:0]]; 
    } 
    while (index != nil) { 
     [values removeAllObjects]; 
     for (int i=0; i<numCols; ++i) { 
      [values addObject:[bigArray objectAtIndex:[index objectAtIndex:i]]]; 
     } 
     [matrix addObject:values]; 
     index = [self nextIndex]; 
    } 
    return [matrix autorelease]; 
} 

このコードをテストしたりデバッグしたりしなかったことに注意してください。

+0

すぐにお返事ありがとうございます!いくつかのバグを修正すると、これは魅力のように機能します! [values addObject行は、サブ配列から値を取得するためにobjectAtIndexを追加する必要があります。 [matrix addObject:values]は[matrix addObject:[NSArray arrayWithArray:values]]でなければなりません。それ以外の場合は、同じ行へのポインタを取得します。 – carrera4s

関連する問題