arrays – 序列数组中的奇数和偶数索引
发布时间:2020-12-14 05:28:26 所属栏目:百科 来源:网络整理
导读:for循环中的for不起作用,因为int类型不符合协议序列. 我有3个数组: 1个主数组,存储数组 1个奇数阵,开头为空 1个偶数组,开头为空 意思是主阵列的所有奇数索引将存储在奇数阵列中,而偶数阵列则相同. while i masterA.count { evenA.append(masterA[i]) if i 0
for循环中的for不起作用,因为int类型不符合协议序列.
我有3个数组: 1个主数组,存储数组 1个奇数阵,开头为空 1个偶数组,开头为空 意思是主阵列的所有奇数索引将存储在奇数阵列中,而偶数阵列则相同. while i < masterA.count { evenA.append(masterA[i]) if i > 0{ oddA.append(masterA[i - 1]) } i += 2 } 然而,这不够好.谁有更好的主意?
这是另一种可能的解决方案
let evenA = stride(from: 0,to: masterA.count,by: 2).map { masterA[$0] } let oddA = stride(from: 1,by: 2).map { masterA[$0] } 元素直接从源阵列中的偶数/奇数位置“拾取”. 表现比较: 我的简单,不是非常复杂的特殊基准测试代码: import Swift let N = 10_000_000 let RUNS = 50 let masterA = (0..<N).map { $0 } var times = (0.0,0.0,0.0) for _ in 1...RUNS { // filter+map (dfri) do { let start = Date() let evenA = masterA.enumerated().filter { $0.0 % 2 == 0 }.map{ $0.1 } let oddA = masterA.enumerated().filter { $0.0 % 2 != 0 }.map{ $0.1 } let time = Date().timeIntervalSince(start) times.0 += time } // flatMap (dfri) do { let start = Date() let evenA = masterA.enumerated().flatMap { $0 % 2 == 0 ? $1 : nil } let oddA = masterA.enumerated().flatMap { $0 % 2 != 0 ? $1 : nil } let time = Date().timeIntervalSince(start) times.1 += time } // stride+map (me) do { let start = Date() let evenA = stride(from: 0,by: 2).map { masterA[$0] } let oddA = stride(from: 1,by: 2).map { masterA[$0] } let time = Date().timeIntervalSince(start) times.2 += time } // loop (Keiwan) do { let start = Date() var evenA = [Int]() var oddA = [Int]() for (index,element) in masterA.enumerated() { if index % 2 == 0 { evenA.append(element) } else { oddA.append(element) } } let time = Date().timeIntervalSince(start) times.3 += time } } print(N,RUNS) print(times.0/Double(RUNS),times.1/Double(RUNS),times.2/Double(RUNS),times.3/Double(RUNS)) 结果:(在MacBook上,在发布模式下运行) #elements filter+map flatMap stride+map loop 10,000 0.0001 0.00008 0.00004 0.00004 100,000 0.0016 0.0008 0.0004 0.0004 1,000,000 0.0295 0.0136 0.0090 0.0091 10,000 0.3025 0.1332 0.0909 0.1250 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |