Cartesian Product関数のこのObjective-C実装をどのように完了させることができますか?

私の質問へのフォローアップとして、こちら、私はデカルト積を生成するObjective-Cで以下のPHP関数を実装しようとしています:

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の次の current reset の機能をコード化しようとすると、配列へのポインタ。

最後のコードブロックを実装して同等の機能を得るにはどうすればよいですか?

6
あまりにもローカライズ?誰かがこれを使って、Objective-Cのデカルト製品機能をナレッジベースに追加することで傷つけないだろうと確信しています...
追加された 著者 barfoon,
配列の列挙型オブジェクトの使用を検討しましたか?
追加された 著者 Shanti K,

2 答え

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;
}
8
追加された
素晴らしい。ありがとうございました。
追加された 著者 barfoon,
いくつかの小さな構文の問題が、私はこれを使用し、それは完全に動作します。 1年以上経っても大変ありがとうございます。
追加された 著者 jwj,

NSArray NSMutableArrayには、現在の次のリセット機能はありません。 あなたはそのような関数を実装するクラスを書くことができると思います

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

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

3関数はインデックスを修正し、

2
追加された
PHP - 日本のコミュニティ [ja]
PHP - 日本のコミュニティ [ja]
4 参加者の

このグループではPHPについて話します。 パートナー:kotaeta.com