如何删除NSDictionary或NSArray中的NSNull
前段时间与某公司的技术交流,被问到一个问题,如何删除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的更多相关文章
- iOS 开发遇到的问题之(nil指针对NSDictionary及NSArray初始化的影响)
nil指针对NSDictionary及NSArray初始化的影响 最近在做项目的时候遇到一个挺坑的崩溃问题,是由于NSDictionary初始化时nil指针引起的崩溃.假设我们现在要初始化一个{key ...
- iOS开发解决json串中的NSNull类型
后端返回的数据中总会出现一些NSNull类型,当我们一处理程序就会崩溃,因此想到把返回的数据中的NSNull类型全部转换成@""空字符串.下面是转化方法: 1 自定义的几个方法:放 ...
- iOS解决json串中的NSNull类型
iOS解决json串中的NSNull类型 后端返回的数据中总会出现一些NSNull类型,当我们一处理程序就会崩溃,因此想到把返回的数据中的NSNull类型全部转换成@""空字符 ...
- NSDictionary或NSArray与JSON字符串相互转换
在iOS 5 中,苹果引入了一个解析JSON串的NSJSONSerialization类.通过该类,我们可以完成JSON数据与NSDictionary和NSArray之间的转化. 以前,我记得我用的是 ...
- NSJSONSerialization-JSON数据与NSDictionary和NSArray之间的转化
转载▼ 在iOS 5 中,苹果引入了一个解析JSON串的NSJSONSerialization类. 通过该类,我们可以完成JSON数据与NSDictionary和NSArray之间的转化. ...
- 用Feature的方式删除SharePoint2010的Page中重复的WebPart
用Feature的方式删除SharePoint2010的Page中重复的WebPart. 代码如下所示: public class SupportCenterDuplicatedWebpartRemo ...
- C#中如何排除/过滤/清空/删除掉字符串数组中的空字符串
C#中要如何才能删除一个字符串数组中的空字符串呢?随着微软对C#不断发展和更新,C#中对于数组操作的方式也变得越来越多样化.以往要实现过滤数组中的空字符串,都是需要实行循环的方式来排除和过滤.C#3. ...
- iOS探索:对NSArray中自定义的对象进行排序
http://mobile.51cto.com/hot-434804.htm 我们开发的每个程序都会使用到一些数据,而这些数据一般被封装在一个自定义的类中.例如一个音乐程序可能会有一个Song类,聊天 ...
- 剑指Offer:从第一个字符串中删除第二个字符串中出现过的所有字符
// 从第一个字符串中删除第二个字符串中出现过的所有字符 #include <stdio.h> char* remove_second_from_first( char *first, c ...
随机推荐
- 使用Python解析JSON数据的基本方法
这篇文章主要介绍了使用Python解析JSON数据的基本方法,是Python入门学习中的基础知识,需要的朋友可以参考下: ----------------------------------- ...
- 【改】iOS学习之键盘类型UIKeyboardType
关于 UITextField 的键盘是可以自定义的,正好在一个代码用这个,就总结一下. 在 UITextField 中有一个 keyboardType 属性,它的类型是一个枚举值,下面就是枚举值和对应 ...
- [python学习] 语言基础—排序函数(sort()、sorted()、argsort()函数)
python的内建排序函数有 sort.sorted两个. 1.基础的序列升序排序直接调用sorted()方法即可 ls = list([5, 2, 3, 1, 4]) new_ls = sorted ...
- iptables 开启端口
1.开启iptables端口 开启1521端口: iptables -A INPUT -p tcp --dport -j ACCEPT iptables -A OUTPUT -p tcp --dpo ...
- ZeroMQ接口函数之 :zmq_msg_init_size - 使用一个指定的空间大小初始化ZMQ消息对象
ZeroMQ 官方地址 :http://api.zeromq.org/4-1:zmq_msg_init_size zmq_msg_init_size(3) ØMQ Manual - ØMQ/3.2.5 ...
- ZeroMQ接口函数之 :zmq_proxy_steerable – 以STOP/RESUME/TERMINATE控制方式开启内置的ZMQ代理
ZeroMQ API 目录 :http://www.cnblogs.com/fengbohello/p/4230135.html ——————————————————————————————————— ...
- ios 单例设计模式
单例模式的意思就是只有一个实例.单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例.这个类称为单例类.单例可用性非常高,用于登录用户管理等可供全局调用. + (AccountMa ...
- java 打印流(PrintStream)
打印流(PrintStream):打印流可以打印任意类型的数据,而且打印流在打印数据之前会将数据转为字符串在进行打印 PrintStream可以接受文件和其他字节输出流,所以打印流是对普通字节输出流的 ...
- HDU 1281 二分图
棋盘游戏 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submis ...
- C# 转换符的重载 显示、隐式转换
class Complex { //保存转换的值 Int32 v; public Complex(Int32 x) { v = x; } public Int32 ToInt32() { return ...