接到一个需求, 现有多个品牌的商品,使用字符串保存已选中的品牌,使用','隔开,可以反选。
分析问题可知:
1. 字符串由多个品牌名字组成,由 ',' 隔开。
2.如果选中的品牌不在字符串内,则拼接到字符串。
3.如果选中的品牌在字符串内,移除这个品牌。
子字符串在字符串内的位置有 3 种情况:
在1.头部 2.在内部 3.在尾部,如果子字符 在内部或尾部,
我们选择移除 ',子字符串',即左边的连接符和子字符串一起移除。
代码如下:使用 NSString 的分类来写的。
/** 字符串处理,添加 字符串,如果已包含此字符串,将其移除 @param com 要插入或者移除的字符串 @param se 连接符 seperator @return 处理结果 */ - (NSString *)addComponet:(NSString *)com with:(NSString *)se { if (IsStrEmpty(com) || IsStrEmpty(se)) { return self; } // 时间 空间 复杂度,另一种思路是用 逗号分割成数组,对数组进行操作 // 1. NSMaxRange(range) > 0 ? contain : do not contain // 1.1 range.location == 0 && NSMaxRange(range) == self.filterParam.brandCode.length e.g. haier // 1.2 range.location == 0 && self.filterParam.brandCode.length > NSMaxRange(range) e.g. haier,haixin,... // 1.3 range.location > 0 && self.filterParam.brandCode.length == NSMaxRange(range) e.g. ...haixin,haier // 1.4 range.location > 0 && self.filterParam.brandCode.length > NSMaxRange(range) e.g. ...,haier,.... NSRange range = [self rangeOfString:com]; if (range.length > 0) { if((range.location == 0) && (self.length == NSMaxRange(range))) { return nil; } else if((range.location == 0) && (self.length > NSMaxRange(range))) { range = NSMakeRange(range.location, range.length + se.length); return [self stringByReplacingCharactersInRange:range withString:@""]; } else { range = NSMakeRange(range.location - se.length, range.length + se.length); return [self stringByReplacingCharactersInRange:range withString:@""]; } } else { NSString *suffix = [NSString stringWithFormat:@"%@%@", se, com]; return [self stringByAppendingString:suffix]; } return self; }