You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何最优实现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
}
优化实现方案

现有代码的问题

  1. Set去重逻辑错误:当插入同名商品的“商品名-生产商”格式字符串时,原商品名仍会留在Set中,导致同一商品的两种格式共存,不符合“多个同名商品才加生产商”的要求。
  2. 填充默认值逻辑不合理:Set本身是无序集合,填充的“空元素”会打乱结果顺序,且占位符描述模糊,不利于理解。
  3. 遍历效率低:没有提前过滤匹配的商品,直接遍历全部products,且插入判断逻辑冗余。

改进后的实现思路

  1. 先过滤出所有名称包含searchString的商品,减少无效遍历。
  2. 对过滤后的商品按名称分组,统一处理格式:
    • 单条同名商品:直接使用商品名。
    • 多条同名商品:每条都采用“商品名 - 生产商”格式。
  3. 从处理后的结果中截取前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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 17:33:25