Swift中如何将整数(如30)按7分组为整数对列表?
如何在Swift中将整数按固定间隔分割为整数对列表?
假设我有一个整数(如30),需要在Swift中将其按7为间隔分割成整数对并放入列表,预期结果应为:
[(1, 7), (8, 14), (15, 21), (22, 28), (29, 30)]
最后一组需处理剩余的数(比如29到30)。
我找到了一段可实现该功能的Kotlin代码,但看不懂Kotlin,不知道怎么转成Swift:
val myInt = 28 val list = (1..ceil(myInt/7.0).toInt()).mapIndexed { index, i -> 7*index + 1 to (7*index + 7).coerceAtMost(myInt) } print(list)
我的尝试与问题
我写了一段Swift代码,但输出有问题:
var days = 30 var daysInt: [Int] = [] var index = 0 for i in 1...days { if index <= days { if i == 1 { index += 1 daysInt.append(index) index += 6 daysInt.append(index) } else { index += 1 daysInt.append(index) index += 6 daysInt.append(index) } } }
输出结果最后出现了35,而不是预期的30,而且实现方式看起来不够简洁。
最优Swift实现
直接参考Kotlin的思路,转成Swift代码如下:
let myInt = 30 let groupCount = Int(ceil(Double(myInt) / 7)) let pairs = (1...groupCount).mapIndexed { index, _ in let start = 7 * index + 1 let end = min(7 * index + 7, myInt) return (start, end) } print(pairs) // 输出:[(1, 7), (8, 14), (15, 21), (22, 28), (29, 30)]
代码解释
- 计算组数:用
ceil(Double(myInt)/7)算出需要分成多少组,比如30除以7约等于4.285,向上取整就是5组。 - 生成每一组:通过
mapIndexed遍历每组的索引,计算每组的起始值7*index+1,结束值则用min确保不超过目标整数myInt,避免最后一组超出范围。 - 返回元组列表:直接生成包含整数对的数组,符合预期格式。
你的代码问题分析
- 循环逻辑冗余:不需要遍历1到days的所有数,只需要遍历组数即可。
- 未限制最大值:最后一组的结束值没有判断是否超过
days,导致出现35这种超出目标的数。 - 存储格式错误:你把所有数存在一个一维数组里,而不是整数对的元组数组,不符合需求的结构。
内容的提问来源于stack exchange,提问作者I Don't Tell
相关产品推荐
相关产品推荐

