博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
如何删除NSDictionary或NSArray中的NSNull
阅读量:5055 次
发布时间:2019-06-12

本文共 4847 字,大约阅读时间需要 16 分钟。

        前段时间与某公司的技术交流,被问到一个问题,如何删除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;}
        一个方法,所有类型全搞定。

转载于:https://www.cnblogs.com/yjh4866/p/6253952.html

你可能感兴趣的文章
boost库的使用
查看>>
美语发音
查看>>
扫描二维码自动识别手机系统(Android/IOS)
查看>>
An Example of SignalR
查看>>
tensorflow 英文文档
查看>>
以查询功能谈下,三层架构中的工厂模式与其中反射的应用
查看>>
HTML中什么时候加px
查看>>
动手动脑
查看>>
.NETCore 添加Docker支持,并上传镜像至Docker Hub,最后在CentOs中拉取镜像运行
查看>>
数据结构初步归纳(一)概念、线性表以及队列和栈
查看>>
LeetCode 513. 找树左下角的值(Find Bottom Left Tree Value)
查看>>
python接口自动化测试十二:对返回的json的简单操作
查看>>
Appium+python自动化(二十三)- 真假美猴王Monkeyrunner与Monkey傻傻的分不清楚(超详解)...
查看>>
python os module
查看>>
JS标准库和数组
查看>>
Scala学习(七)---包和引入
查看>>
day-42mysql
查看>>
jQuery点击事件绑定onClick和on()
查看>>
==和.equals()在封装类型与基本类型比较中的注意点
查看>>
[HNOI2010]合唱队 区间DP
查看>>