2013-06-26 197 views
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将不被添加到该大阵列。

回答

1

如果您使用NSSet而不是NSArray,您可以免费获得uniquing。结果是(可变的)一组(不可变的)数组。

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]); 

静止打印 “2”,因为setCsetB是相等的。

+0

这真的很有趣。如果我尝试添加'NSSet * setB = [NSSet setWithArray:@ [// arrayC @ [@ 4,@ 1,@ 5,@ 6,@ 4,@ 2],// arrayX @ [@ 1,@ 4,@ 6,@ 12,@ 14],// arrayY @ [@ 13,@ 33,@ 50,@ 34],// arrayZ ]];'to bigSet? (我采取了arrayB,并在arrayX的前两个数字之间切换) – Segev

+0

@Sha在你的问题中,你指定内部集合(或字符串?)保存并比较它们的元素的顺序。因此,如果更改顺序'setB'不会与'bigSet'中的另一个集合相等。 'bigSet'将包含另一个元素。如果你想改变这种行为,只需将内部数组(x,y,z)更改为集。 –

+0

真的很棒的信息。谢谢。 – Segev

0

我不知道为什么会这样做,我不确定我是否完全遵循,但是在通过条目比较进行任何输入之前,可以对每个次要数组进行排序。那么订单就没有关系了。

0

也许你可以连接键和值作为一个新的字符串,并将它们进行比较。

此致敬礼。

/丹尼尔·卡尔松

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

尝试类似这样的代码。

+0

这是一个非常好的答案,但它不会涵盖两个相同的数组,但它们中的数组排列顺序不同的情况。 – Segev