Swift中如何将数组分割为指定的两个目标子数组?
解决Swift数组按索引奇偶分割的问题
你的需求是将原数组按元素的原始索引奇偶性分割成两个数组:索引为偶数(0、2、4...)的元素放入listItems1,索引为奇数(1、3、5...)的放入listItems2。但你当前的chunked分组方式逻辑不符合这个需求,导致10被错误分到listItems1里,下面是修正方案:
问题分析
你当前的chunked(into: 2)会把原数组分成每2个元素一组:
[[1,3], [2,4], [5,7], [6,8], [9,10]]
之后筛选offset为偶数的组(第0、2、4组),flatMap后得到[1,3,5,7,9,10],这和你期望的结果不符——因为最后一组[9,10]的offset是4(偶数),所以整个组都被加入listItems1,导致10出现在错误的数组中。
正确实现方式
直接遍历原数组的索引,根据索引的奇偶性筛选元素,这是最直接且符合需求的方式:
let arrays1 = [1, 3, 2, 4, 5, 7, 6, 8, 9, 10] // 筛选索引为偶数的元素(0、2、4、6、8) let listItems1 = arrays1.enumerated().filter { $0.offset % 2 == 0 }.map { $0.element } // 筛选索引为奇数的元素(1、3、5、7、9) let listItems2 = arrays1.enumerated().filter { $0.offset % 2 != 0 }.map { $0.element }
运行后结果完全符合你的期望:
listItems1 = [1, 2, 5, 6, 9] listItems2 = [3, 4, 7, 8, 10]
简化写法(可选)
如果你想更简洁,可以用reduce一次完成两个数组的分割,避免两次遍历:
let (listItems1, listItems2) = arrays1.enumerated().reduce(into: ([Int](), [Int]())) { result, pair in if pair.offset % 2 == 0 { result.0.append(pair.element) } else { result.1.append(pair.element) } }
这种方式只遍历数组一次,性能更优,尤其当数组元素较多时。
内容的提问来源于stack exchange,提问作者LenKen
相关产品推荐
相关产品推荐

