2011-11-25 18 views
6

Là một theo dõi câu hỏi của tôi here, tôi đang cố gắng để thực hiện các chức năng PHP sau đây trong Objective-C, mà sẽ tạo ra một sản phẩm Descartes:Làm thế nào tôi có thể hoàn thành việc thực hiện Mục tiêu-C này của một chức năng của sản phẩm Descartes?

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

Dưới đây là những gì tôi có cho đến nay:

-(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; 

} 

Tôi bị lạc khi cố gắng mã tương đương với các hàm next, currentreset của PHP, vì tôi không biết cách tham chiếu đến con trỏ nội bộ vào mảng.

Làm cách nào để triển khai khối mã cuối cùng và nhận hàm tương đương?

+1

bạn đã xem xét sử dụng các đối tượng điều tra viên của mảng? –

+0

Quá địa phương hóa? Tôi chắc rằng ai đó có thể sử dụng điều này xuống đường, và thêm một chức năng sản phẩm Descartes trong Objective-C vào knowledgebase sẽ không làm tổn thương ... – barfoon

Trả lời

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

Tuyệt vời. Cảm ơn bạn. – barfoon

+0

Vài vấn đề cú pháp nhỏ nhưng tôi đã sử dụng nó và nó hoạt động hoàn hảo. Cảm ơn nhiều, thậm chí hơn một năm sau đó. – jwj

-2

NSArray NSMutableArray không có chức năng đặt lại hiện tại tiếp theo. Tôi nghĩ rằng bạn có thể viết một lớp học để thực hiện chức năng như

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

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

3 chức năng sẽ thay đổi chỉ số,

Các vấn đề liên quan