美文网首页
比较数组是否相同(isEqualToArray:)

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

作者: 小赤焰 | 来源:发表于2018-03-02 10:38 被阅读0次

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

  • 发现了几个新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值就可以了。

灵感来自它

相关文章

网友评论

      本文标题:比较数组是否相同(isEqualToArray:)

      本文链接:https://www.haomeiwen.com/subject/zinoxftx.html