比较数组是否相同(isEqualToArray:)

2018-03-02  本文已影响0人  小赤焰

项目中出现了需求。要比较两个数组是否一样。

a. 通过集合来处理。将两个数组放在两个新集合中,然后取两个集合的差集,如果差集里面有数据,说明两个集合不一样,即两个数组不一样。

NSArray *array1 = @[@"2",@"3",@"1"];
NSArray *array2 = @[@“1”,@“4”,@“5”];
NSMutableSet *set1 = [NSMutableSet setWithArray:array1];
NSMutableSet *set2 = [NSMutableSet setWithArray:array2];
//顺便复习下交并补
[set1 unionSet:set2];//取并集后 set1中为1,2,3,4,5
[set1 intersectSet:set2];  //取交集后 set1中为1
[set1 minusSet:set2];//取差集后 set1中为2,3     array1 与array2的差集
[set2 minusSet:set1];//取差集后 set2中为4,5       array2 与array1的差集

b. filteredArrayUsingPredicate。用谓词来过滤数组。下方代码中result应该是@[@"A", @"F", @"G"], 即arr1中存在arr2中不存在的数据。

NSArray *arr1 = [NSArray arrayWithObjects:@"A",@"B",@"C",@"D",@"E",@"F",@"G", nil];
NSArray *arr2 = [NSArray arrayWithObjects:@"B",@"C",@"D",@"E",nil];
NSArray *result = [arr1 filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"not (self in %@)", arr2]];

isEqualToArray: 官方描述,内容相同,下标相同,则为 equal。

Two arrays have equal contents if they each hold the same number of objects and objects at a given index in each array.

内容相同指的是什么呢?
如果是基本数据类型,就是它的字面值。如果是自定义对象,则是这个对象的 isEqual: 值。所以我们需要取重写自定义对象的 isEqual:方法。在这个方法中,直接判断对应属性是否相同即可。
但是出于效率的考虑,诞生hash值的对比。如果这个哈希值在自定义对象的时候没有重写,这个哈希值就是这个对象的内存地址。所以在之前的isEqual:中,我们先去判断两个对象的hash值是否相等,如果相同,再去判断对应属性,效率会提升。而重写hash值的方法遵循下方原则:

In reality, a simple XOR over the hash values of critical properties is sufficient 99% of the time(对关键属性的hash值进行位或运算作为hash值)

在小型项目中,一般对对象的id取hash值就可以了。

灵感来自它

上一篇 下一篇

猜你喜欢

热点阅读