2011-11-25 9 views
6

Per dare un seguito alla mia domanda here, sto cercando di implementare la seguente funzione PHP in Objective-C, che genererà un prodotto cartesiano:Come posso completare questa implementazione Objective-C di una funzione di prodotto cartesiana?

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

Ecco quello che ho finora:

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

} 

Mi sto perdendo quando provo a codificare l'equivalente delle funzioni di PHP next, current e reset, perché non so come fare riferimento al puntatore interno dell'array.

Come posso implementare l'ultimo blocco di codice e ottenere una funzione equivalente?

+1

Avete considerato utilizzando l'oggetto enumeratore della matrice? –

+0

Troppo localizzato? Sono sicuro che qualcuno potrebbe usare questo in fondo alla strada, e l'aggiunta di una funzione di prodotto cartesiano in Objective-C alla knowledgebase non guasterebbe ... – barfoon

risposta

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

Incredibile. Grazie. – barfoon

+0

Un paio di piccoli problemi di sintassi ma l'ho usato e funziona perfettamente. Grazie mille, anche più di un anno dopo. – jwj

-2

NSArray NSMutableArray non ha le seguenti funzioni di reset correnti. Penso che si possa scrivere una classe per implementare tale funzione

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

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

la funzione 3 modificherà l'indice,