2011-11-25 17 views
6

jako uzupełnienie do mojego pytania here, staram się realizować następujące funkcje PHP w Objective-C, która będzie generować produkt kartezjański:Jak mogę ukończyć tę implementację Celive-C funkcji kartezjańskiego produktu?

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

Oto co mam do tej pory:

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

} 

Zgubiłem się, próbując kodować odpowiedniki funkcji PHP next, current i reset, ponieważ nie wiem jak odwołać się do wewnętrznego wskaźnika do tablicy.

Jak mogę zaimplementować ostatni blok kodu i uzyskać równoważną funkcję?

+1

zrobił rozważyć użycie obiektu Enumerator tablicy? –

+0

Zbyt zlokalizowane? Jestem pewien, że ktoś mógłby użyć tego w dół, a dodanie funkcji kartezjańskiej produktu w Objective-C do bazy wiedzy nie zaszkodzi ... – barfoon

Odpowiedz

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

Niesamowite. Dziękuję Ci. – barfoon

+0

Kilka małych problemów z składnią, ale użyłem tego i działa idealnie. Wielkie dzięki, nawet ponad rok później. – jwj

-2

NSArray NSMutableArray nie ma następnych funkcji resetowania prądu. myślę, że można napisać klasa zaimplementować taką funkcję

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

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

funkcja 3 zmodyfikuje indeksu

Powiązane problemy