比较两个集合中的对象

时间:2014-12-06 23:08:43

标签: ios objective-c arrays collections

我有以下情况:

我有两个集合类(可以是NSArrayNSMutableArrayNSSetNSOrderedSet或其他最适合此案例的集合类,它们包含相同的类型(对于集合中的所有对象而言,唯一的一个意义是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的结果放在该数组中,并将其他两个初始数组与临时数组进行比较。虽然看起来很冗长。有没有更好的方法我不知道?

3 个答案:

答案 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] ];