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
相关产品推荐
相关产品推荐

