1

文字列を含む複数の配列を含む配列 (例の bigArray) があります。bigArray に別の配列 (arrayA など) を追加する必要がありますが、そのような配列が既に存在するかどうかを確認したいと考えています。存在する場合、追加したくありません。小さな配列 (例の arrayX など) の順序は、それらを互いに区別しないため、同じ配列を含むが順序が異なる arrayA などの配列が既にある場合、(arrayZ、arrayY、arrayX の代わりに arrayX ,arrayY,arrayZ (ただし文字列の内容は同じ)、その配列は大きな配列に追加されません。

どうすればこれを達成できますか?

例:

配列の例:

-bigArray

--arrayA

----arrayX -> 16,4,5,6,64

----arrayY -> 1,3,6,72,14

----arrayZ -> 13,73,50,34

--arrayB

----arrayX -> 1,4,5,6,4,2

----arrayY -> 1,4,6,12,14

----arrayZ -> 13,33,50,34

小さな配列の順序はそれらを区別しません:

--arrayc

----array -> 16,4,5,6,64

----array -> 1,3,6,72,14

is the same as:

--arrayd

----array -> 1,3,6,72,14

----array -> 16,4,5,6,64

したがって、arrayD は大きな配列に追加されません。

4

4 に答える 4

1

NSSet代わりに使用するNSArrayと、ユニークなものが無料で手に入ります。結果は、配列の (不変) セットの (可変) セットです。

    NSSet *setA = [NSSet setWithArray:@[   // arrayA
        @[@16,@4,@5,@6,@64],               // arrayX
        @[@1,@3,@6,@72,@14],               // arrayY
        @[@13,@73,@50,@34],                // arrayZ
    ]];

    NSSet *setB = [NSSet setWithArray:@[   // arrayB
        @[@1,@4,@5,@6,@4,@2],              // arrayX
        @[@1,@4,@6,@12,@14],               // arrayY
        @[@13,@33,@50,@34],                // arrayZ
    ]];

    NSMutableArray *bigSet = [NSMutableSet setWithArray:@[setA, setB]];

    NSLog(@"%lu", [bigSet count]);

予想どおり、これは「2」を出力します。

    NSSet *setC = [NSSet setWithArray:@[   // arrayC
        @[@1,@4,@6,@12,@14],               // arrayY
        @[@1,@4,@5,@6,@4,@2],              // arrayX
        @[@13,@33,@50,@34],                // arrayZ
    ]];

    [bigSet addObject:setC];

    NSLog(@"%lu", [bigSet count]);

setCsetBが等しいため、引き続き "2" が出力されます。

于 2013-06-26T08:23:47.767 に答える
1

ArrayB例で追加したい配列のオブジェクト ( ) を反復処理し- (BOOL)containsObject:(id)anObject、より小さい配列 ( xy、およびz) がArray A.

if(ArrayA.count!=ArrayB.count){
    //Don't check because the arrays will not be same, so add ArrayB
}else{
    int i=0,counter=0;
    for(i=0;i<ArrayB.count;i++){
        if(![ArrayA contains [ArrayB objectAtIndex:i]]){
            counter = 1;
        }
    }

    if(counter==1){
       //Add ArrayB because elements are not same.
    }else{
       //Don't add ArrayB because elements are same.
    }
}

このコードのようなものを試してください。

于 2013-06-26T08:02:42.947 に答える
0

なぜこれが行われているのかはわかりませんし、完全に従うかどうかもわかりませんが、エントリごとの比較を行う前に、各マイナー配列を並べ替えることができます。それなら順番は関係ありません。

于 2013-06-26T07:51:24.237 に答える
0

おそらく、キーと値を新しい文字列として連結して、それらを比較することができます。

よろしくお願いします。

/ダニエル・カールソン

于 2013-06-26T07:52:02.087 に答える