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

Swift技术求助:如何将字符串数组按指定组数均匀拆分?

家务项均匀分配给清洁人员的分组问题

我正在开发一款应用,用户可输入家务项(chores)与清洁人员(cleaners),需要将家务项均匀分配给清洁人员。

当前实现代码

当前我用以下代码实现数组分组:

// 这个扩展根据.chunked(by:)传入的数值将数组拆分为多个子数组
var cleaners: [String] = ["person1", "person2"]
var chores: [String] = ["dishes", "laundry", "sweep patio", "dust", "trash","bathroom"]

var choresSorted = chores.chunked(by: cleaners.count)

extension Collection {
    func chunked(by distance: Int) -> [[Element]] {
        precondition(distance > 0, "distance must be greater than 0") // 防止无限循环

        var index = startIndex
        let iterator: AnyIterator<Array<Element>> = AnyIterator({
            let newIndex = self.index(index, offsetBy: distance, limitedBy: self.endIndex) ?? self.endIndex
            defer { index = newIndex }
            let range = index ..< newIndex
            return index != self.endIndex ? Array(self[range]) : nil
        })

        return Array(iterator)
    }
}

// 当前输出:
// [["dishes", "laundry"], ["sweep patio", "dust"], ["trash","bathroom"]]

问题与期望输出

当前代码传入清洁人员数量(2)时,会将家务项拆分为每组2个元素的3组,但我需要拆分为和清洁人员数量一致的2组,每组3个元素,期望输出:

// [["dishes", "laundry", "sweep patio"], ["dust", "trash","bathroom"]]

注:已掌握chores.shuffle()方法,无需相关指导。

解决方案

原chunked(by:)方法是按每组元素数量拆分,而我们需要按分组数量(即清洁人员数量)拆分,同时保证每组元素尽可能均匀。可以重新实现一个按分组数量拆分的扩展方法:

extension Collection {
    func splitIntoGroups(numberOfGroups: Int) -> [[Element]] {
        precondition(numberOfGroups > 0, "numberOfGroups must be greater than 0")
        
        let totalElements = self.count
        let baseElementsPerGroup = totalElements / numberOfGroups
        let remainder = totalElements % numberOfGroups
        
        var result: [[Element]] = []
        var currentIndex = startIndex
        
        for groupIndex in 0..<numberOfGroups {
            // 余数部分的前几组多分配1个元素,保证均匀性
            let elementsToTake = baseElementsPerGroup + (groupIndex < remainder ? 1 : 0)
            let endIndex = self.index(currentIndex, offsetBy: elementsToTake, limitedBy: self.endIndex) ?? self.endIndex
            
            result.append(Array(self[currentIndex..<endIndex]))
            currentIndex = endIndex
        }
        
        return result
    }
}

使用方式

将原代码中的chunked(by:)替换为新方法即可:

var choresSorted = chores.splitIntoGroups(numberOfGroups: cleaners.count)
// 输出:[["dishes", "laundry", "sweep patio"], ["dust", "trash","bathroom"]]

内容的提问来源于stack exchange,提问作者Joshua Wiseman

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 07:35:20