场景需求:
解析某博客或者者书籍网站数据时:已知它的书籍首页URL地址,这个首页含有它的书籍目录及其章节的链接,APP想拉取它的目录节点,然而,该目录页面里面的章节可能有重复的内容,那么解析后,我们向内存中保存章节信息的时候,需要过滤。
过滤的标准:假如某数据结构中含有重复的url,就不再重复保存。
数据结构选型:
- (NSString *)fileterUrl{ //... if ([self.sectionUrlArr containsObject:sectionUrlStr]) { return nil; } [self.sectionUrlArr addObject:sectionUrlSt]; //...sectionUrlStr = [FilterEngine filterUrl];if (sectionModel.sectionUrlStr) { [sectionArr addObject:sectionModel];}过滤成功。
数组的containsObject:只能检测 内存地址相同 的对象,并不能检测 内存不同但字符串内容相 的NSString对象。
#import "EqualString.h"@implementation EqualString- (BOOL)isEqual:(id)object { if (self == object) { return YES; } if (![object isKindOfClass:[NSString class]]) { return NO; } NSString *strEntity = (NSString *)object; if ([strEntity isEqualToString:self]) { return YES; } else { return NO; }}@end过滤成功。
除了自己设置NSSting类,再考察用分类NSString+Equal重写isEqual的方案。
#import "NSString+Equal.h"@implementation NSString (Equal)- (BOOL)isEqual:(id)object { if (self == object) { return YES; } if (![object isKindOfClass:[NSString class]]) { return NO; } NSString *strEntity = (NSString *)object; if ([strEntity isEqualToString:self]) { return YES; } else { return NO; }}@end这种方案最后无效。
除了方案不成功,另外很怪异的是,这样写分类并拖到到工程,会对全局的NSString都有影响。即便没有任何地方import该分类。
其实,对于上述的数组类型的数据结构,假如要查询一个元素,时间复杂度是比较高的,由于它必需遍历才能实现查询操作。
而实际应使用中,查询效率比较高的是哈希表,这种结构在OC开发中有两种常见形式,一种是字典,一种是集合。集合每个元素只要要一样值就可,而字典每个元素则需要存储两种数据,键和值。
哈希表另外,哈希结构在Android开发中对应的形式则相似下面的:
private static HashSet<String> sectionUrlSet = new HashSet<>();- (NSMutableSet *)sectionUrlSet { if(!_sectionUrlSet){ _sectionUrlSet = [NSMutableSet set]; } return _sectionUrlSet;}if ([self.sectionUrlSet containsObject:sectionUrlStr]) { return nil;}[self.sectionUrlSet addObject:sectionUrlStr];过滤成功。
- (NSMutableSet *)sectionUrlDict { if(!_sectionUrlDict){ _sectionUrlDict = [NSMutableDictionary dictionary]; } return _sectionUrlDict;}if ([[self.sectionUrlDict allKeys] containsObject:sectionUrlStr]) { return nil;}[self.sectionUrlDict setObject:@"" forKey:sectionUrlStr];过滤成功。