我有以下情况:
我有两个集合类(可以是NSArray
,NSMutableArray
,NSSet
,NSOrderedSet
或其他最适合此案例的集合类,它们包含相同的类型(对于集合中的所有对象而言,唯一的一个意义是isEqual
方法不会返回true
的任何两个元素。
假设第一个集合实例包含以下对象(1,2,3,4,5)
,第二个集合(2,3,4,6,7)
。现在我需要一个方法来返回两个集合之间的差异,额外的信息与每个集合的区别是什么。
该示例的示例结果是:(1,5) was removed from the first collection and (6,7) added two the second collection
。
我知道如果我将NSMutableArray
与排序列表一起使用并确定哪个列表中的元素多于另一个列表,我可以使用removeObjectsInArray
来获取不同对象的列表(如{ {3}}或Compare two arrays with the same value but with a different order),但不知道哪个对象在哪个集合中。我可以创建一个临时集合并将removeObjectsInArray
的结果放在该数组中,并将其他两个初始数组与临时数组进行比较。虽然看起来很冗长。有没有更好的方法我不知道?
答案 0 :(得分:1)
通过使用NSPredicate,我发现了一种更加流畅的方式来做你想做的事。当我运行以下代码时:
NSArray *firstArray = [[NSArray alloc] initWithObjects:@"1",@"2",@"3",@"4",@"5",@"6",@"7", nil];
NSArray *secondArray = [[NSArray alloc] initWithObjects:@"1",@"2",@"3",@"8",nil];
NSArray *itemsMissingFromSecondArray = [firstArray filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"NOT SELF IN %@", secondArray]];
NSArray *itemsMissingFromFirstArray = [secondArray filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"NOT SELF IN %@", firstArray]];
NSLog(@"itemsMissingFromFirstArray=%@\nitemsMissingFromSecondArray=%@", itemsMissingFromFirstArray, itemsMissingFromSecondArray);
我得到以下输出,显示另一个数组中每个数组缺少的内容:
itemsMissingFromFirstArray=(
8
)
itemsMissingFromSecondArray=(
4,
5,
6,
7
)
比排序和合并更少的代码,不使用一堆临时数组,并且简单易读。
注意:如果有人也想知道两个阵列中的项目,解决方案同样简单:
NSArray *itemsFoundInBothArrays = [firstArray filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"SELF IN %@", secondArray]];
答案 1 :(得分:0)
+ (NSArray *) removeObjectsFromArray :(NSArray *)arrayToRemoveFrom thatAreAlsoIn:(NSArray *)arrayOfItemsToRemove
{
NSMutableArray *newArray = [[NSMutableArray alloc] initWithArray:arrayToRemoveFrom];
[newArray removeObjectsInArray:arrayOfItemsToRemove];
return newArray;
}
+(void) findArrayDifferences
{
NSArray *bigArray = [[NSArray alloc] initWithObjects:@"1",@"2",@"3",@"4",@"5",@"6",@"7", nil];
NSArray *smallArray = [[NSArray alloc] initWithObjects:@"1",@"2",@"3",@"8",nil];
NSArray *itemsInBigArrayThatAreNotInSmallArray = [self removeObjectsFromArray:bigArray thatAreAlsoIn:smallArray];
NSArray *itemsThatAreInBothArrays = [self removeObjectsFromArray:bigArray thatAreAlsoIn:itemsInBigArrayThatAreNotInSmallArray];
NSArray *itemsInSmallArrayThatAreNotInBigArray = [self removeObjectsFromArray:smallArray thatAreAlsoIn:itemsThatAreInBothArrays];
NSLog(@"itemsInBigArrayThatAreNotInSmallArray=%@\nitemsThatAreInBothArrays=%@\nitemsInSmallArrayThatAreNotInBigArray=%@", itemsInBigArrayThatAreNotInSmallArray, itemsThatAreInBothArrays, itemsInSmallArrayThatAreNotInBigArray);
}
这导致以下输出:
itemsInBigArrayThatAreNotInSmallArray=(
4,
5,
6,
7
)
itemsThatAreInBothArrays=(
1,
2,
3
)
itemsInSmallArrayThatAreNotInBigArray=(
8
)
答案 2 :(得分:0)
我想如果你想知道差异,可以使用NSMutableSet和minusSet函数。
[set1 minusSet:set2];
将为您提供set1中的元素,但不会立即显示在set2中。因此,您不需要任何临时收集,并再次与原始收集进行比较。
否则,如果您只想删除元素,可以使用NSArray并执行以下操作:
[secondArray removeObjectsInArray:firstArray];
编辑: 要一次性找到所有差异:
[ [set1 unionSet:set2] minusSet: [set1 intersectSet:set2] ];