iOS数组的去重,判空,删除元素,删除重复元素 model排序 等
一: 去重
有时需要将NSArray中去除重复的元素,而存在NSArray中的元素不一定都是NSString类型。今天想了想,加上朋友的帮助,想到两种解决办法,先分述如下。
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
)
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]];
}
}
顺序就不会乱了。
二 、有些开发者,在判断数组是否为空时,会写成:
- if (array != nil)
或是:
- 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.也是使用引用计数的方式,不过要倒序方式来进行删除,这样,即使后面的元素被删除之后,也不会影响前面的元素在数组中的indexNSMutableArray *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排序 等的更多相关文章
- Java 删除ArrayList中重复元素,保持顺序
// 删除ArrayList中重复元素,保持顺序 public static List<Map<String, Object>> removeDuplicat ...
- iOS 数组的去重(普通的无序的去重和排序好的去重)
本文转载至 http://blog.csdn.net/zhaopenghhhhhh/article/details/24972645 有时需要将NSArray中去除重复的元素,而存在NSArray中的 ...
- Python遍历列表删除多个元素或者重复元素
在遍历list的时候,删除符合条件的数据,结果不符合预期 num_list = [1, 2, 2, 2, 3] print(num_list) for item in num_list: if i ...
- 删除列表中重复元素以及求list中元素个数
Python 去除列表中重复的元素 来自比较容易记忆的是用内置的set l1 = ['b','c','d','b','c','a','a'] l2 = list(set(l1)) print l2 还 ...
- 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 ...
- java 对一个字符串去重,即去掉字符串内重复元素
String str ="abc|efa|abc|efa|abc"; String str1 = str.replaceAll("(?s)(.)(?=.*\\1)&quo ...
- 218。重复元素II(重复元素的下标差值<=K)(哈希)
给定一个整数数组和一个整数 k,判断数组中是否存在两个不同的索引 i 和 j,使得 nums [i] = nums [j],并且 i 和 j 的差的 绝对值 至多为 k. 示例 1: 输入: nums ...
- arrayList的合并以及删除重复元素
arrayList的合并: package listTest;//arrayList的合并 import java.util.ArrayList; public class arrayListTest ...
- python列表删除重复元素的三种方法
给定一个列表,要求删除列表中重复元素. listA = ['python','语','言','是','一','门','动','态','语','言'] 方法1,对列表调用排序,从末尾依次比较相邻两个元素 ...
随机推荐
- 简单的Sqlite使用方法
Sqlite的作用不言而喻,就是帮助开发者建立本地数据库,存储一些基本信息.不做过多阐述,需要的深入了解的可以找度娘,本文是针对Sqlite小白在使用上提供一些实例. 一.导入Sqlite.swift ...
- wechat4j获取用户昵称乱码修复
项目对接微信公众号平台时,微信的官方给出的建议是使用wechat4j.官方建议的,自然心里踏实,但实际用起来时发现wechat4j埋有很多雷,最让人心烦意乱的就是中文乱码问题. 之前写过一篇为JAXB ...
- Feign PathVariable annotation was empty on param 0.
使用Feign的时候,如果参数中带有 @PathVariable形式的参数,则要用value=""标明对应的参数,否则会抛出IllegalStateException异常 如 @P ...
- ubuntu16.04后续工作
一.ruijie https://blog.csdn.net/u012217085/article/details/24369335 https://blog.csdn.net/Lv_Victor/a ...
- php入门(三)
PHP 面向对象: 在php5中 var就是public的别名. 变量 $this 代表自身的对象. PHP_EOL;为换行符 构造函数+析构函数 <?php class Site { /* 成 ...
- (转载)gcc & gdb & make 定义与区别
gcc & gdb & make 定义与区别 GCC 通常所说的GCC是GUN Compiler Collection的简称,除了编译程序之外,它还含其他相关工具,所以它能把易于人类使 ...
- ANR异常
ANR异常 一.简介 解决方法:别在主线程中写非常耗时的操作 二.代码实例 点击之后,不停点击,乱点 出现anr异常 代码 /anr/src/anr/MainActivity.java package ...
- Svn Replacement For Git Stash
svn 实现git stash类似的功能 % svn diff > WorkInProgress.txt % svn revert -R . <make changes> % svn ...
- vue-awesome-swiper 第一张自动跳过
昨天在上班中要做一个商品页面,需求是从后台接口获得轮播图的路径,然后传到封装好的组件中,本来以为很简单啊,没什么毛病,开始动手~ 东西很简单,新建一个banner组件 如下: <template ...
- Find the odd int
Given an array, find the int that appears an odd number of times. There will always be only one inte ...