一: 去重

有时需要将NSArray中去除重复的元素,而存在NSArray中的元素不一定都是NSString类型。今天想了想,加上朋友的帮助,想到两种解决办法,先分述如下。

1.利用NSDictionary的AllKeys(AllValues)方法
可以将NSArray中的元素存入一个字典,然后利用AllKeys或者AllValues取得字典的所有键或值,这些键或值都是去重的。
示例代码:

NSArray *arr = @[@111,@222,@111];

NSMutableDictionary *dict = [NSMutableDictionary dictionary];

for (NSNumber *number in arr) {

[dict setObject:number forKey:number];

}

NSLog(@"%@",[dict allValues]);

输出结果为:

2013-05-21 12:03:49.449 test1[4377:c07] (

111,

222

)

 
2.利用NSSet的AllObjects方法
这种方法更快,利用NSSet不会添加重复元素的特性。不过去重的数组没有进行排序,如果需要排序,可以使用NSSortDescriptor类。
示例代码:

NSArray *arr = @[@111,@222,@111];

NSSet *set = [NSSet setWithArray:arr];

NSLog(@"%@",[set allObjects]);

输出结果为:

2013-05-21 12:06:26.508 test1[4547:c07] (

111,

222

)

排序的去重

很多时候可能会遇到需要去除NSArray重复的元素,用了很多方法。

最方便快捷的是NSSet.但是NSSet去重后有时候数组元素的顺序会

打乱。于是换了另外一种方法如下:

NSMutableArray *categoryArray = [[NSMutableArray alloc] init];

for (unsigned i = 0; i < [nameArray count]; i++){

if ([categoryArray containsObject:[nameArray objectAtIndex:i]] == NO){

[categoryArray addObject:[nameArray objectAtIndex:i]];

}

}

顺序就不会乱了。

二  、有些开发者,在判断数组是否为空时,会写成:

  1. if (array != nil)

或是:

    1. if (array.count != 0)       三 : 删除元素

      这个问题其实可以分为两种方式来看待:一种是在循环遍历的时候就进行删除操作,另外一种就是在循环遍历完之后在进行操作

      一》在循环遍历的时候就进行操作,有以下几种方法:

      1.在使用快速遍历进行删除操作之后要加break,来结束,这样就不会出现问题。

      NSMutableArray *arr1 = [[NSMutableArrayalloc]initWithObjects:@"ABC",@"DEF",@"ABC",@"ABC",@"QWE",@"TTT",nil];

      for(NSString *strin arr1)

      {

      NSLog(@"%@",str);

      if([str isEqualToString:@"ABC"])

      {

      [arr1 removeObject:str];

      break;

      }

      }

      2.使用索引计数的方式,但是要注意的是当我们删除一个元素时,arr.count 是进行改变的,所以可能造成漏删,所以我们要对索引计数进行操作,每当删除一个元素时,都让i - 1,这样才能达到不重不漏的效果

      NSMutableArray *arr1 = [[NSMutableArrayalloc]initWithObjects:@"ABC",@"DEF",@"ABC",@"ABC",@"QWE",@"TTT",nil];

      for(int i  =0;i<arr1.count;i++)

      {

      NSLog(@"%lu",arr1.count);

      NSString *str = arr1[i];

      if([str isEqualToString:@"ABC"])

      {

      [arr1 removeObjectAtIndex:i];

      i--;

      }

      }

      for(NSString *strin arr1)

      {

      NSLog(@"%@",str);

      }

       
      3.也是使用引用计数的方式,不过要倒序方式来进行删除,这样,即使后面的元素被删除之后,也不会影响前面的元素在数组中的index
       

      NSMutableArray *arr1 = [[NSMutableArrayalloc]initWithObjects:@"ABC",@"DEF",@"ABC",@"ABC",@"QWE",@"TTT",nil];

      for(int i = (int)arr1.count -1 ; i>=0 ; i--)

      {

      NSLog(@"%lu",arr1.count);

      NSString *str = arr1[i];

      if([str isEqualToString:@"ABC"])

      {

      [arr1 removeObjectAtIndex:i];

      }

      }

      for(NSString *strin arr1)

      {

      NSLog(@"%@",str);

      }

      4.使用系统的方法,enumerateObjectsUsingBlock 里面有一个stop 指针,当我们找到对应的str后,使*stop = YES 即可。

      [arr1 enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {

      NSLog(@"%lu",idx);

      if([obj isEqualToString:@"ABC"])

      {

      *stop = YES;

      [arr1 removeObject:obj];

      }

      }];

      二》在循环遍历完之后在进行操作,这种方式主要是遍历找到对应的index,或者说给他添加一个标识符,最后来统一进行删除。

      1.将要删除的字符串放在一个数组里,最后一起删除

      NSMutableArray *arr1 = [[NSMutableArrayalloc]initWithObjects:@"QQQ",@"ABC",@"DEF",@"ABC",@"ABC",@"QWE",@"TTT",nil];

      NSMutableArray *arr = [[NSMutableArrayalloc]init];

      for(NSString *strin arr1)

      {

      if([str isEqualToString:@"ABC"])

      {

      [arr addObject:str];

      break; //如果只删除某一种字符串,那么当找到这个字符串之后就可以结束,不用再找,免得浪费时间,如果要删除不止一个字符串,那么应当找到所有要删除的字符串在进行删除

      }

      }

      [arr1 removeObjectsInArray:arr];

      2.将要删除的字符串所在的下表添加在一个NSMutableIndexSet 中,最后一起删除

      NSMutableArray *arr1 = [[NSMutableArrayalloc]initWithObjects:@"QQQ",@"ABC",@"DEF",@"ABC",@"ABC",@"QWE",@"TTT",nil];

      NSMutableIndexSet *set = [[NSMutableIndexSetalloc]init];

      for(int i =0 ; i < arr1.count ; i++)

      {

      NSString *str = arr1[i];

      if([str isEqualToString:@"ABC"])

      {

      [set addIndex:i];

      }

      }

      [arr1 removeObjectsAtIndexes:set];

      四 :  删除重复元素

      NSMutableArray *result = [NSMutableArray array];
              for (NSString *string in arr) {
                  if (![result containsObject:string]) {
                      [result addObject:string];
                  }
              }

      五: 排序  model排序

          [_historyNoticeModel.content  sortUsingComparator:^NSComparisonResult(HistoryItemNotices*   _Nonnull obj1, HistoryItemNotices  * _Nonnull obj2) {

              if(obj2.isNew < obj1.isNew){

                  returnNSOrderedAscending;

              }

              returnNSOrderedDescending;

          }];

iOS数组的去重,判空,删除元素,删除重复元素 model排序 等的更多相关文章

  1. Java 删除ArrayList中重复元素,保持顺序

    // 删除ArrayList中重复元素,保持顺序          public static List<Map<String, Object>> removeDuplicat ...

  2. iOS 数组的去重(普通的无序的去重和排序好的去重)

    本文转载至 http://blog.csdn.net/zhaopenghhhhhh/article/details/24972645 有时需要将NSArray中去除重复的元素,而存在NSArray中的 ...

  3. Python遍历列表删除多个元素或者重复元素

    在遍历list的时候,删除符合条件的数据,结果不符合预期   num_list = [1, 2, 2, 2, 3] print(num_list) for item in num_list: if i ...

  4. 删除列表中重复元素以及求list中元素个数

    Python 去除列表中重复的元素 来自比较容易记忆的是用内置的set l1 = ['b','c','d','b','c','a','a'] l2 = list(set(l1)) print l2 还 ...

  5. python 删除list中重复元素

    list = [1,1,3,4,6,3,7] 1. for s in list: if list.count(s) >1: list.remove(s) 2. list2=[] for s in ...

  6. java 对一个字符串去重,即去掉字符串内重复元素

    String str ="abc|efa|abc|efa|abc"; String str1 = str.replaceAll("(?s)(.)(?=.*\\1)&quo ...

  7. 218。重复元素II(重复元素的下标差值<=K)(哈希)

    给定一个整数数组和一个整数 k,判断数组中是否存在两个不同的索引 i 和 j,使得 nums [i] = nums [j],并且 i 和 j 的差的 绝对值 至多为 k. 示例 1: 输入: nums ...

  8. arrayList的合并以及删除重复元素

    arrayList的合并: package listTest;//arrayList的合并 import java.util.ArrayList; public class arrayListTest ...

  9. python列表删除重复元素的三种方法

    给定一个列表,要求删除列表中重复元素. listA = ['python','语','言','是','一','门','动','态','语','言'] 方法1,对列表调用排序,从末尾依次比较相邻两个元素 ...

随机推荐

  1. 输入n,求1~n累加

    最开始可能会使用for循环来计算,现在直接使用等差数据计算和公式:s=(a0+n)*n/2 long sum(int n) { long ret=0: ret = (1+n)* n /2: retur ...

  2. HDFS并行复制Distcp

    1)Distcp(分布式拷贝)是用于大规模集群内部和集群之间拷贝的工具. 2)distcp命令是以MR作业(没有R任务)的形式实现的,把文件和目录的列表作为M任务的输入.每一个文件是由一个M任务来拷贝 ...

  3. python-高阶函数和闭包

    高阶函数:把函数作为参数传入,这样的函数成为高阶函数. 高阶函数,higher-order function Abs()内置函数:绝对值 函数名是什么:指向函数的变量 传入函数 一个函数的参数是否可以 ...

  4. javaWeb中JNDI的使用,为什么要加java:comp/env前缀

    转载自(http://blog.csdn.net/guodongsoft/article/details/52399527) 我们在使用JNDI调用某个对象时,会有下述两种方式 context.loo ...

  5. centos7更改主机名

    操作环境 [root@centos701 ~]# uname Linux [root@centos701 ~]# uname -a Linux centos701 3.10.0-693.el7.x86 ...

  6. Elasticsearch之几个重要的分词器

    前提 什么是倒排索引? Elasticsearch之分词器的作用 Elasticsearch之分词器的工作流程 Elasticsearch之停用词 Elasticsearch之中文分词器 Elasti ...

  7. 如何更改nagios监控默认的检查时间

    /usr/local/nagios/etc/nagios.cfg: interval_length 表示时间单位,默认为60,即1分钟 /usr/local/nagios/etc/objects/se ...

  8. spring-boot 加入拦截器Interceptor

    1.spring boot拦截器默认有 HandlerInterceptorAdapter AbstractHandlerMapping UserRoleAuthorizationIntercepto ...

  9. mac terminal update management pack

    npm -g outdated npm -g install npm@6.4.1

  10. 为什么我们选择parquet

    说明:此方案已经我们已经运行1年. 1.场景描述: 我们对客户登录日志做了数据仓库,但实际业务使用中有一些个共同点, A  需要关联维度表 B  最终仅取某个产品一段时间内的数据 C 只关注其中极少的 ...