2011-11-25 27 views
6

作爲後續行動,我的問題here,我想實現在Objective-C以下PHP函數,這將產生一個笛卡爾乘積:如何完成此笛卡爾產品功能的Objective-C實現?

function array_cartesian_product($arrays) 
{ 
    $result = array(); 
    $arrays = array_values($arrays); 
    $sizeIn = sizeof($arrays); 
    $size = $sizeIn > 0 ? 1 : 0; 
    foreach ($arrays as $array) 
     $size = $size * sizeof($array); 
    for ($i = 0; $i < $size; $i ++) 
    { 
     $result[$i] = array(); 
     for ($j = 0; $j < $sizeIn; $j ++) 
      array_push($result[$i], current($arrays[$j])); 
     for ($j = ($sizeIn -1); $j >= 0; $j --) 
     { 
      if (next($arrays[$j])) 
       break; 
      elseif (isset ($arrays[$j])) 
       reset($arrays[$j]); 
     } 
    } 
    return $result; 
} 

這是我到目前爲止有:

-(NSArray *) array_cartesian_product:(NSArray *)arrays { 

    NSMutableArray *result = [[NSMutableArray alloc] init]; 

    int sizeIn = [arrays count]; 
    int size = (sizeIn > 0) ? 1 : 0; 

    for(id array in arrays) 
     size *= [array count]; 


    for(int i = 0; i < size; i++) { 

     for (int j = 0; j < sizeIn; j++) { 
      [result insertObject:[arrays objectAtIndex:j] atIndex:i]; 
     } 

     for (int j = (sizeIn - 1); j >= 0; j--) { 

      // ????? 

     } 


    } 

    return result; 

} 

當我嘗試編碼相當於PHP的next,currentreset函數時,我迷路了,因爲我不知道如何引用指向數組的內部指針。

如何實現最後一塊代碼並獲得等效函數?

+1

你考慮使用數組的枚舉對象? –

+0

太局部?我敢肯定有人可以使用它,並且在Objective-C中將知識庫中的笛卡爾產品功能添加到知識庫中不會造成傷害... – barfoon

回答

8
NSArray *cartesianProductOfArrays(NSArray *arrays) 
{ 
    int arraysCount = arrays.count; 
    unsigned long resultSize = 1; 
    for (NSArray *array in arrays) 
     resultSize *= array.count; 
    NSMutableArray *product = [NSMutableArray arrayWithCapacity:resultSize]; 
    for (unsigned long i = 0; i < resultSize; ++i) { 
     NSMutableArray *cross = [NSMutableArray arrayWithCapacity:arraysCount]; 
     [product addObject:cross]; 
     unsigned long n = i; 
     for (NSArray *array in arrays) { 
      [cross addObject:[array objectAtIndex:n % array.count]]; 
      n /= array.count; 
     } 
    } 
    return product; 
} 
+0

令人驚歎。謝謝。 – barfoon

+0

幾個小的語法問題,但我用這個,它完美的作品。非常感謝,甚至超過一年之後。 – jwj

-2

NSArray NSMutableArray沒有下一個當前的重置函數。 我想你可以寫一個類來實現這樣的功能

@interface myArray { 
    NSMutableArray* array;//the real array 
    int index;//hole the index 
} 

-(id)current; 
-(id)next; 
-(id)reset; 
@end 

的3個功能將修改索引,