如何最优实现func listProductsByName(searchString: String) -> Set<String>?
问题
需要实现一个满足以下要求的函数:
- 返回值:包含指定字符串的10个商品名称。若存在多个同名商品,需按“商品名 - 生产商名称”格式添加生产商信息;否则直接返回商品名。
- 函数定义:
func listProductsByName(searchString: String) -> Set<String> - 限制:不能使用错误处理,原本想用默认数据填充Set但方案不可行,求最佳实现方式。
现有代码如下:
func listProductsByName(searchString: String) -> Set<String> { var searchProducts = Set<String>() for product in products { if product.name.contains(searchString) { if !searchProducts.contains(product.name){ searchProducts.insert(product.name)} else { searchProducts.insert(product.name + " - " + product.producer)} } if searchProducts.count == 10 { break } } if searchProducts.count < 10 { var emptyElement = 0 print("找到的商品不足10件:\(searchProducts)") repeat { searchProducts.insert("空元素编号 \(emptyElement)") emptyElement += 1 } while searchProducts.count < 10 } return searchProducts }
优化实现方案
现有代码的问题
- Set去重逻辑错误:当插入同名商品的“商品名-生产商”格式字符串时,原商品名仍会留在Set中,导致同一商品的两种格式共存,不符合“多个同名商品才加生产商”的要求。
- 填充默认值逻辑不合理:Set本身是无序集合,填充的“空元素”会打乱结果顺序,且占位符描述模糊,不利于理解。
- 遍历效率低:没有提前过滤匹配的商品,直接遍历全部
products,且插入判断逻辑冗余。
改进后的实现思路
- 先过滤出所有名称包含
searchString的商品,减少无效遍历。 - 对过滤后的商品按名称分组,统一处理格式:
- 单条同名商品:直接使用商品名。
- 多条同名商品:每条都采用“商品名 - 生产商”格式。
- 从处理后的结果中截取前10个,不足10个时填充清晰的占位符,先通过数组保证顺序再转为Set(兼容函数返回类型要求)。
优化后的代码
func listProductsByName(searchString: String) -> Set<String> { // 过滤出名称匹配的商品 let matchedProducts = products.filter { $0.name.contains(searchString) } // 按商品名称分组,处理显示格式 var formattedProducts = [String]() let groupedByName = Dictionary(grouping: matchedProducts, by: { $0.name }) for (name, group) in groupedByName { if group.count == 1 { formattedProducts.append(name) } else { // 同名商品统一添加生产商后缀 formattedProducts.append(contentsOf: group.map { "\($0.name) - \($0.producer)" }) } // 达到10个后提前终止处理 if formattedProducts.count >= 10 { break } } // 截取前10个,不足则填充占位符 var result = Array(formattedProducts.prefix(10)) while result.count < 10 { result.append("未找到匹配商品 \(result.count + 1)") } // 转为Set返回(若业务允许,建议返回[String]更合理,避免Set打乱顺序) return Set(result) }
关键说明
- 分组处理确保了同名商品的格式统一,不会出现“纯商品名”和“商品名-生产商”混合的情况。
- 先过滤再分组的逻辑减少了无效计算,遍历效率更高。
- 用数组先处理顺序和数量再转Set,避免了Set无序导致的填充逻辑混乱,占位符描述更清晰。
内容的提问来源于stack exchange,提问作者Polyandiy
相关产品推荐
相关产品推荐

