项目中出现了需求。要比较两个数组是否一样。
- 发现了几个新Api,虽然没有帮上忙,但是也算开阔了眼界,记录下。
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]];
- 正确解决方式 :重写 -hash + -isEqualToArray:
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值就可以了。