如何删除NSDictionary或NSArray中的NSNull

https://blog.csdn.net/yjh4866/article/details/49835469

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

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

 

  1.  
    // 删除NSArray中的NSNull
  2.  
    - (NSMutableArray *)removeNullFromArray:(NSArray *)arr
  3.  
    {
  4.  
    NSMutableArray *marr = [NSMutableArray array];
  5.  
    for (int i = 0; i < arr.count; i++) {
  6.  
    NSValue *value = arr[i];
  7.  
    // 删除NSDictionary中的NSNull,再添加进数组
  8.  
    if ([value isKindOfClass:NSDictionary.class]) {
  9.  
    [marr addObject:[self removeNullFromDictionary:(NSDictionary *)value]];
  10.  
    }
  11.  
    // 删除NSArray中的NSNull,再添加进数组
  12.  
    else if ([value isKindOfClass:NSArray.class]) {
  13.  
    [marr addObject:[self removeNullFromArray:(NSArray *)value]];
  14.  
    }
  15.  
    // 剩余的非NSNull类型的数据添加进数组
  16.  
    else if (![value isKindOfClass:NSNull.class]) {
  17.  
    [marr addObject:value];
  18.  
    }
  19.  
    }
  20.  
    return marr;
  21.  
    }
  22.  
    // 删除Dictionary中的NSNull
  23.  
    - (NSMutableDictionary *)removeNullFromDictionary:(NSDictionary *)dic
  24.  
    {
  25.  
    NSMutableDictionary *mdic = [NSMutableDictionary dictionary];
  26.  
    for (NSString *strKey in dic.allKeys) {
  27.  
    NSValue *value = dic[strKey];
  28.  
    // 删除NSDictionary中的NSNull,再保存进字典
  29.  
    if ([value isKindOfClass:NSDictionary.class]) {
  30.  
    mdic[strKey] = [self removeNullFromDictionary:(NSDictionary *)value];
  31.  
    }
  32.  
    // 删除NSArray中的NSNull,再保存进字典
  33.  
    else if ([value isKindOfClass:NSArray.class]) {
  34.  
    mdic[strKey] = [self removeNullFromArray:(NSArray *)value];
  35.  
    }
  36.  
    // 剩余的非NSNull类型的数据保存进字典
  37.  
    else if (![value isKindOfClass:NSNull.class]) {
  38.  
    mdic[strKey] = dic[strKey];
  39.  
    }
  40.  
    }
  41.  
    return mdic;
  42.  
    }

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

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

 

 

  1.  
    - (NSObject *)removeNullFrom:(NSObject *)object
  2.  
    {
  3.  
    NSObject *objResult = nil;
  4.  
    NSMutableArray *marrSearch = nil;
  5.  
    if ([object isKindOfClass:NSNull.class]) {
  6.  
    return nil;
  7.  
    }
  8.  
    else if ([object isKindOfClass:NSArray.class]) {
  9.  
    objResult = [NSMutableArray arrayWithArray:(NSArray *)object];
  10.  
    marrSearch = [NSMutableArray arrayWithObject:objResult];
  11.  
    }
  12.  
    else if ([object isKindOfClass:NSDictionary.class]) {
  13.  
    objResult = [NSMutableDictionary dictionaryWithDictionary:(NSDictionary *)object];
  14.  
    marrSearch = [NSMutableArray arrayWithObject:objResult];
  15.  
    }
  16.  
    else {
  17.  
    return object;
  18.  
    }
  19.  
    while (marrSearch.count > 0) {
  20.  
    NSObject *header = marrSearch[0];
  21.  
    if ([header isKindOfClass:NSMutableDictionary.class]) {
  22.  
    // 遍历这个字典
  23.  
    NSMutableDictionary *mdicTemp = (NSMutableDictionary *)header;
  24.  
    for (NSString *strKey in mdicTemp.allKeys) {
  25.  
    NSObject *objTemp = mdicTemp[strKey];
  26.  
    // 将NSDictionary替换为NSMutableDictionary
  27.  
    if ([objTemp isKindOfClass:NSDictionary.class]) {
  28.  
    NSMutableDictionary *mdic = [NSMutableDictionary dictionaryWithDictionary:(NSDictionary *)objTemp];
  29.  
    mdicTemp[strKey] = mdic;
  30.  
    [marrSearch addObject:mdic];
  31.  
    }
  32.  
    // 将NSArray替换为NSMutableArray
  33.  
    else if ([objTemp isKindOfClass:NSArray.class]) {
  34.  
    NSMutableArray *marr = [NSMutableArray arrayWithArray:(NSArray *)objTemp];
  35.  
    mdicTemp[strKey] = marr;
  36.  
    [marrSearch addObject:marr];
  37.  
    }
  38.  
    // 删除NSNull
  39.  
    else if ([objTemp isKindOfClass:NSNull.class]) {
  40.  
    mdicTemp[strKey] = nil;
  41.  
    }
  42.  
    }
  43.  
    }
  44.  
    else if ([header isKindOfClass:NSMutableArray.class]) {
  45.  
    // 遍历这个数组
  46.  
    NSMutableArray *marrTemp = (NSMutableArray *)header;
  47.  
    for (int i = marrTemp.count-1; i >= 0; i--) {
  48.  
    NSObject *objTemp = marrTemp[i];
  49.  
    // 将NSDictionary替换为NSMutableDictionary
  50.  
    if ([objTemp isKindOfClass:NSDictionary.class]) {
  51.  
    NSMutableDictionary *mdic = [NSMutableDictionary dictionaryWithDictionary:(NSDictionary *)objTemp];
  52.  
    [marrTemp replaceObjectAtIndex:i withObject:mdic];
  53.  
    [marrSearch addObject:mdic];
  54.  
    }
  55.  
    // 将NSArray替换为NSMutableArray
  56.  
    else if ([objTemp isKindOfClass:NSArray.class]) {
  57.  
    NSMutableArray *marr = [NSMutableArray arrayWithArray:(NSArray *)objTemp];
  58.  
    [marrTemp replaceObjectAtIndex:i withObject:marr];
  59.  
    [marrSearch addObject:marr];
  60.  
    }
  61.  
    // 删除NSNull
  62.  
    else if ([objTemp isKindOfClass:NSNull.class]) {
  63.  
    [marrTemp removeObjectAtIndex:i];
  64.  
    }
  65.  
    }
  66.  
    }
  67.  
    else {
  68.  
    // 到这里就出错了
  69.  
    }
  70.  
    [marrSearch removeObjectAtIndex:0];
  71.  
    }
  72.  
    return objResult;
  73.  
    }

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

 

 

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

posted @ 2018-07-23 15:56  sundaysios  阅读(525)  评论(0)    收藏  举报