NSDictionaryまたはNSArrayからNSNullを削除する方法
5059 ワード
先日、ある会社との技術交流で、NSDictionaryのNSNullを削除する方法を聞かれました.当時は紙に書いていたが、以前はXcodeコンパイラに頼りすぎて、方法名が全部書けず、結局書けなかったので、軽蔑された体には完璧ではないと思います.
最近チャンスがあって実現しました.まず、再帰的な実装スキームを実行します.
きれいですね.NSArrayのNSNullを削除できる方法と、NSDictionaryのNSNullを削除できる方法があります.
しかし、しかし、私は非再帰アルゴリズムのほうが好きです.特にAI検索では.再帰を使うと、考えがまとまらず計算が少なくなるのではないかと心配です.次は、再帰的でない案です.コードは次のとおりです.
一つの方法は、すべてのタイプが全部できます.
投稿先:http://www.cocoachina.com/bbs/read.php?tid=331661
最近チャンスがあって実現しました.まず、再帰的な実装スキームを実行します.
// 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