如何删除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 ...
随机推荐
- 注解:【基于外键的】Hibernate双向1->1关联
Person与Address关联:双向1->1,[基于外键的]. #主表不应该控制关联关系.(否则会导致生成额外的update语句,从而导致性能下降), #因此主表对应的实体中使用@OneToO ...
- vaadin_demo
简介:主要一个登陆界面,登陆后跳转到主界面: 主界面功能是点新增,新增人员数据会保存到显示列表中: 一个很简单的demo 下面是截图
- AutoCompleteTextView自动补全文本框
AutoCompleteTextView的作用是在输入框中输入我们想要输入的信息,就会出现其他与其相关的提示信息 下面是实例代码: MainActivity.java package com.shao ...
- 详解ASP.NET MVC的请求生命周期
本文的目的旨在详细描述asp.net mvc请求从开始到结束的每一个过程. 我希望能理解在浏览器输入url并敲击回车来请求一个asp.net mvc网站的页面之后发生的任何事情. 为什么需要关心这些? ...
- Django+Tastypie作后端,Backbone作前端的TodoMVC
TodoMVC是各种js框架入门的比较经典的例子,详细可查看github地址https://github.com/tastejs/todomvc 接着上篇文章, 1,先在github上把backbon ...
- iOS NSDate本地化
1. NSDateFormatter *outputFormatter = [[NSDateFormatter alloc] init]; [outputFormatter setLocale:[NS ...
- 《Invert》开发日志05:终止
今天终于看了久闻大名的<独立游戏大电影>,然后我就做了一个坑爹的决定:终止“Invert”项目的开发.没错,在还没正式开工之前,我就决定停掉这个项目,而且是永久终止.做这个决定并不是因为觉 ...
- SASS+COMPASS 自适应 学习笔记
来源 http://snugug.github.io/RWD-with-Sass-Compass/#/ 1 安装 COMPASS 扩展 安装 方式 gem 'extension', '~>X.Y ...
- NOI 题库 7624
7624 山区建小学 描述 政府在某山区修建了一条道路,恰好穿越总共m个村庄的每个村庄一次,没有回路或交叉,任意两个村庄只能通过这条路来往.已知任意两个相邻的村庄之间的距离为di(为正整数),其中, ...
- workspace路径有中文情况会报java.net.MalformedURLException: unknown protocol: d错误
原因及描述:java读取xml文件时如果出现中文字符就会出现这类错误 解决方法: 1.将中文路径改为英文路径 2.读取file时"file:///d:/" 而不是"d ...