比较阵列内的数组阵列到另一个阵列的字符串
我有一个数组(包含字符串的数组)的数组(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将不被添加到该大阵列。
如果您使用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”,因为setC
和setB
是相等的。
我不知道为什么会这样做,我不确定我是否完全遵循,但是在通过条目比较进行任何输入之前,可以对每个次要数组进行排序。那么订单就没有关系了。
也许你可以连接键和值作为一个新的字符串,并将它们进行比较。
此致敬礼。
/丹尼尔·卡尔松
你可以尝试通过你想在你的例子添加(ArrayB
)阵列的对象迭代,并尝试- (BOOL)containsObject:(id)anObject
对于较小的阵列(x
,y
是否检查,并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.
}
}
尝试类似这样的代码。
这是一个非常好的答案,但它不会涵盖两个相同的数组,但它们中的数组排列顺序不同的情况。 – Segev
这真的很有趣。如果我尝试添加'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
@Sha在你的问题中,你指定内部集合(或字符串?)保存并比较它们的元素的顺序。因此,如果更改顺序'setB'不会与'bigSet'中的另一个集合相等。 'bigSet'将包含另一个元素。如果你想改变这种行为,只需将内部数组(x,y,z)更改为集。 –
真的很棒的信息。谢谢。 – Segev