前段时间与某公司的技术交流,被问到一个问题,如何删除NSDictionary中的NSNull。当时在纸上写,以前太依赖Xcode编译器了,以至于方法名都写不全,最终也没写出来,我想我肯定被鄙视的体无完肤。

最近有机会实现了一下。先来递归实现方案:

// 删除NSArray中的NSNull
- (NSMutableArray *)removeNullFromArray:(NSArray *)arr
{
NSMutableArray *marr = [NSMutableArray array];
for (int i = 0; i < arr.count; i++) {
NSValue *value = arr[i];
// 删除NSDictionary中的NSNull,再添加进数组
if ([value isKindOfClass:NSDictionary.class]) {
[marr addObject:[self removeNullFromDictionary:(NSDictionary *)value]];
}
// 删除NSArray中的NSNull,再添加进数组
else if ([value isKindOfClass:NSArray.class]) {
[marr addObject:[self removeNullFromArray:(NSArray *)value]];
}
// 剩余的非NSNull类型的数据添加进数组
else if (![value isKindOfClass:NSNull.class]) {
[marr addObject:value];
}
}
return marr;
}
// 删除Dictionary中的NSNull
- (NSMutableDictionary *)removeNullFromDictionary:(NSDictionary *)dic
{
NSMutableDictionary *mdic = [NSMutableDictionary dictionary];
for (NSString *strKey in dic.allKeys) {
NSValue *value = dic[strKey];
// 删除NSDictionary中的NSNull,再保存进字典
if ([value isKindOfClass:NSDictionary.class]) {
mdic[strKey] = [self removeNullFromDictionary:(NSDictionary *)value];
}
// 删除NSArray中的NSNull,再保存进字典
else if ([value isKindOfClass:NSArray.class]) {
mdic[strKey] = [self removeNullFromArray:(NSArray *)value];
}
// 剩余的非NSNull类型的数据保存进字典
else if (![value isKindOfClass:NSNull.class]) {
mdic[strKey] = dic[strKey];
}
}
return mdic;
}

很美观哈。俩方法,第一个方法能将NSArray中的NSNull删除,第二方法能将NSDictionary中的NSNull删除。



        可是,可是,我更喜欢非递归算法的呀,尤其在AI搜索里。用递归的话,很担心考虑不周全导致少计算一大块。下面,就来一发非递归的方案。代码如下:

- (NSObject *)removeNullFrom:(NSObject *)object
{
NSObject *objResult = nil;
NSMutableArray *marrSearch = nil;
if ([object isKindOfClass:NSNull.class]) {
return nil;
}
else if ([object isKindOfClass:NSArray.class]) {
objResult = [NSMutableArray arrayWithArray:(NSArray *)object];
marrSearch = [NSMutableArray arrayWithObject:objResult];
}
else if ([object isKindOfClass:NSDictionary.class]) {
objResult = [NSMutableDictionary dictionaryWithDictionary:(NSDictionary *)object];
marrSearch = [NSMutableArray arrayWithObject:objResult];
}
else {
return object;
}
while (marrSearch.count > 0) {
NSObject *header = marrSearch[0];
if ([header isKindOfClass:NSMutableDictionary.class]) {
// 遍历这个字典
NSMutableDictionary *mdicTemp = (NSMutableDictionary *)header;
for (NSString *strKey in mdicTemp.allKeys) {
NSObject *objTemp = mdicTemp[strKey];
// 将NSDictionary替换为NSMutableDictionary
if ([objTemp isKindOfClass:NSDictionary.class]) {
NSMutableDictionary *mdic = [NSMutableDictionary dictionaryWithDictionary:(NSDictionary *)objTemp];
mdicTemp[strKey] = mdic;
[marrSearch addObject:mdic];
}
// 将NSArray替换为NSMutableArray
else if ([objTemp isKindOfClass:NSArray.class]) {
NSMutableArray *marr = [NSMutableArray arrayWithArray:(NSArray *)objTemp];
mdicTemp[strKey] = marr;
[marrSearch addObject:marr];
}
// 删除NSNull
else if ([objTemp isKindOfClass:NSNull.class]) {
mdicTemp[strKey] = nil;
}
}
}
else if ([header isKindOfClass:NSMutableArray.class]) {
// 遍历这个数组
NSMutableArray *marrTemp = (NSMutableArray *)header;
for (int i = marrTemp.count-1; i >= 0; i--) {
NSObject *objTemp = marrTemp[i];
// 将NSDictionary替换为NSMutableDictionary
if ([objTemp isKindOfClass:NSDictionary.class]) {
NSMutableDictionary *mdic = [NSMutableDictionary dictionaryWithDictionary:(NSDictionary *)objTemp];
[marrTemp replaceObjectAtIndex:i withObject:mdic];
[marrSearch addObject:mdic];
}
// 将NSArray替换为NSMutableArray
else if ([objTemp isKindOfClass:NSArray.class]) {
NSMutableArray *marr = [NSMutableArray arrayWithArray:(NSArray *)objTemp];
[marrTemp replaceObjectAtIndex:i withObject:marr];
[marrSearch addObject:marr];
}
// 删除NSNull
else if ([objTemp isKindOfClass:NSNull.class]) {
[marrTemp removeObjectAtIndex:i];
}
}
}
else {
// 到这里就出错了
}
[marrSearch removeObjectAtIndex:0];
}
return objResult;
}

一个方法,所有类型全搞定。

发帖地址:http://www.cocoachina.com/bbs/read.php?tid=331661

如何删除NSDictionary或NSArray中的NSNull的更多相关文章

  1. iOS 开发遇到的问题之(nil指针对NSDictionary及NSArray初始化的影响)

    nil指针对NSDictionary及NSArray初始化的影响 最近在做项目的时候遇到一个挺坑的崩溃问题,是由于NSDictionary初始化时nil指针引起的崩溃.假设我们现在要初始化一个{key ...

  2. iOS开发解决json串中的NSNull类型

    后端返回的数据中总会出现一些NSNull类型,当我们一处理程序就会崩溃,因此想到把返回的数据中的NSNull类型全部转换成@""空字符串.下面是转化方法: 1 自定义的几个方法:放 ...

  3. iOS解决json串中的NSNull类型

    iOS解决json串中的NSNull类型   后端返回的数据中总会出现一些NSNull类型,当我们一处理程序就会崩溃,因此想到把返回的数据中的NSNull类型全部转换成@""空字符 ...

  4. NSDictionary或NSArray与JSON字符串相互转换

    在iOS 5 中,苹果引入了一个解析JSON串的NSJSONSerialization类.通过该类,我们可以完成JSON数据与NSDictionary和NSArray之间的转化. 以前,我记得我用的是 ...

  5. NSJSONSerialization-JSON数据与NSDictionary和NSArray之间的转化

    转载▼     在iOS  5 中,苹果引入了一个解析JSON串的NSJSONSerialization类. 通过该类,我们可以完成JSON数据与NSDictionary和NSArray之间的转化. ...

  6. 用Feature的方式删除SharePoint2010的Page中重复的WebPart

    用Feature的方式删除SharePoint2010的Page中重复的WebPart. 代码如下所示: public class SupportCenterDuplicatedWebpartRemo ...

  7. C#中如何排除/过滤/清空/删除掉字符串数组中的空字符串

    C#中要如何才能删除一个字符串数组中的空字符串呢?随着微软对C#不断发展和更新,C#中对于数组操作的方式也变得越来越多样化.以往要实现过滤数组中的空字符串,都是需要实行循环的方式来排除和过滤.C#3. ...

  8. iOS探索:对NSArray中自定义的对象进行排序

    http://mobile.51cto.com/hot-434804.htm 我们开发的每个程序都会使用到一些数据,而这些数据一般被封装在一个自定义的类中.例如一个音乐程序可能会有一个Song类,聊天 ...

  9. 剑指Offer:从第一个字符串中删除第二个字符串中出现过的所有字符

    // 从第一个字符串中删除第二个字符串中出现过的所有字符 #include <stdio.h> char* remove_second_from_first( char *first, c ...

随机推荐

  1. 算法系列:Fibonacci

    Copyright © 1900-2016, NORYES, All Rights Reserved. http://www.cnblogs.com/noryes/ 欢迎转载,请保留此版权声明. -- ...

  2. HTTP POST请求报文格式分析与Java实现文件上传

    时间 2014-12-11 12:41:43  CSDN博客 原文  http://blog.csdn.net/bboyfeiyu/article/details/41863951 主题 HTTPHt ...

  3. SVG实现导航动画

    效果图动画后 html <!DOCTYPE html> <html > <head> <meta charset="UTF-8"> ...

  4. 爱特梅尔ATMEL全系列芯片解密单片机破解

    爱特梅尔ATMEL全系列芯片解密单片机破解 ATMEL芯片介绍: ATMEL公司为全球性的业界领先企业,致力于设计和制造各类微控制器.电容式触摸解决方案.先进逻辑.混合信号.非易失性存储器和射频 (R ...

  5. linux vi命令

    >>>>>>>>>>>>>>>>>>>> 2016.12.6: vi是交互式的编 ...

  6. 新的篇章--Python

    这周已经开始Python的学习了,感觉Python类似于Powershell, 但又有不同点.在此总结一下新学到的资料: 简单的使用变量的方法: name= input("input you ...

  7. [转]如何解决外边距margin叠加的问题探讨

    两个或多个毗邻的普通流中的块元素垂直方向上的 margin 会折叠,那么如何使元素上下margin不折叠呢?下面的方法或许对大家有所帮助 一.首先你要知道什么情况下会触发:两个或多个毗邻的普通流中的块 ...

  8. 在DrawingVisual上绘制圆形的进度条,类似于IOS系统风格。

    1.说明:在WPF中,文件下载时需要显示下载进度,由于系统自带的条型进度条比较占用空间,改用圆形的进度条,需要在DrawingVisual上呈现. 运行的效果如图: private Point Get ...

  9. Leetcode Insert Interval

    Given a set of non-overlapping intervals, insert a new interval into the intervals (merge if necessa ...

  10. @寒冬winter 大神的css作业问题

    块级元素   ①总是在新行上开始: ②高度,行高以及外边距和内边距都可控制: ③宽度缺省是它的容器的100%,除非设定一个宽度. ④它可以容纳内联元素和其他块元素 行内级元素   ①和其他元素都在一行 ...