iOS - 数组去重

图片源于网络

无序的去重

  • 1.利用NSDictionary的AllKeys(AllValues)方法

    可以将NSArray中的元素存入一个字典,然后利用AllKeys或者AllValues取得字典的所有键或值,这些键或值都是去重的

          NSArray *originalArray = @[@1, @2, @3, @1, @3];
          NSMutableDictionary *dict = [NSMutableDictionary dictionary];
          for (NSNumber *n in originalArray) {
              [dict setObject:n forKey:n];
          }
          NSLog(@"dict: %@",[dict allValues]);
    
  • 2.利用NSSet特性, 放入集合自动去重

    NSSet的特性: 确定性、无序性、互异性

          NSArray *originalArray = @[@1, @2, @3, @1, @3];
          NSSet *set = [NSSet setWithArray:originalArray];
          NSLog(@"result: %@", [set allObjects]);
    

注:如果需要排序,可以使用NSSortDescriptor类(参考iOS - 排序: NSSortDescriptor

有序的去重

  • 1.开辟新的内存空间(使用containsObject:方法)

    判断是否存在,若不存在则添加到数组中,得到最终结果的顺序不发生变化

          NSArray *originalArray = @[@1, @2, @3, @1, @3];
          NSMutableArray *resultArray = [NSMutableArray array];
          
          for (NSString *item in originalArray) {
              if (![resultArray containsObject:item]) {
                  [resultArray addObject:item];
              }
          }
          NSLog(@"resultArray : %@", resultArray);
    
  • 2.通过valueForKeyPath (@"@distinctUnionOfObjects.self")

          NSArray *originalArray = @[@1, @2, @3, @1, @3];
          NSArray *resultArray = [originalArray valueForKeyPath:@"@distinctUnionOfObjects.self"];
          NSLog(@"result: %@", resultArray);
    

模型对象的去重

  • 1.通过model类的唯一标识来判断

    • 定义一个简单的model类
        // Model.h
        @interface Model : NSObject
        
        @property (nonatomic, copy) NSString *ID;
        @property (nonatomic, copy) NSString *name;
        @end
        
        // Model.m
        @implementation Model
        @end
    
    • 去除数组中重复model对象
        //创建model类对象
        Model *model1 = [[Model alloc]init];
        model1.ID = @"1";
        Model *model2 = [[Model alloc]init];
        model1.ID = @"2";
        Model *model3 = [[Model alloc]init];
        model1.ID = @"3";
        Model *model4 = [[Model alloc]init];
        model1.ID = @"1";
        Model *model5 = [[Model alloc]init];
        model1.ID = @"3";
        //添加到数组中
        NSMutableArray *originalArray = [NSMutableArray arrayWithArray:@[model1,model2,model3,model4,model5]];
        
        NSMutableArray *resultArray = [NSMutableArray arrayWithArray:originalArray];
        //去重
        for (NSInteger x = 0; x < originalArray.count; x++) {
            
            for (NSInteger y = x+1;y < originalArray.count; y++) {
                Model *tempModel = originalArray[x];
                Model *model = originalArray[y];
                if ([tempModel.ID isEqualToString:model.ID]) {
                    [resultArray removeObject:model];
                }
            }
        }
        NSLog(@"result: %@", resultArray);
    

参考

iOS - 排序: NSSortDescriptor

高效开发iOS -- 那些不为人知的KVC

iOS数组去重常用方式

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 项目中由于某些需求有时需要将NSArray中去除重复的元素,而存在NSArray中的元素不一定都是NSString...
    Easy_VO阅读 3,545评论 2 5
  • 1.开辟新的内存空间 判断是否存在,若不存在则添加到数组中,得到最终结果的顺序不发生变化 2.利用NSDictio...
    我是不是叫没烦恼阅读 33,733评论 4 43
  • 在工作工程中我们不必要会遇到,在数组中有重复数据的时候,如何去除重复的数据呢? 第一种:利用NSDictionar...
    花开花非花阅读 900评论 0 1
  • 对于开发过程中,数组去除重复的元素,如果数组中的元素是非自定义类型,则直接使用NSSet集合就可以去重。如下 NS...
    李Mr阅读 865评论 0 0
  • 1.利用keyValue的方式 (@distinctUnionOfObjects.self) NSMutableA...
    一个人朝圣阅读 271评论 0 1