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
}
然而,这不够好。任何人都有更好的主意吗?
答案 0 :(得分:17)
这是另一种可能的解决方案:
DropDownList
元素被选中&#34;直接来自源数组中的偶数/奇数位置。
效果比较:
我的简单,非常复杂的临时基准测试代码:
onChange
结果:(在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,000 0.3025 0.1332 0.0909 0.1250
答案 1 :(得分:6)
您可以在循环时使用enumerated()
同时获取索引和值:
for (index, element) in masterA.enumerated() {
if index % 2 == 0 {
evenA.append(element)
} else {
oddA.append(element)
}
}
这会将element
的每个masterA
与oddA
中的奇数索引以及evenA
中具有偶数索引的每个元素存储起来。
答案 2 :(得分:5)
可能我误解了你的意图,但似乎你希望Lo2.DataBodyRange.Cells(Tablesize2, 1) = Lo.Name
Lo2.DataBodyRange.Cells(Tablesize2, 2) = Sht1.Range("A" & CurrentRow + 1).Value
Lo2.DataBodyRange.Cells(Tablesize2, 3) = Sht1.Range("B" & CurrentRow + 1).Value
的{em>元素具有奇数索引应该存储在masterA
中,反之,具有偶数索引的oddA
元素应存储在masterA
。
您可以通过过滤evenA
w.r.t来实现此目的。 masterA
的索引,可从masterA
获得。
masterA.enumerated()
正如@Hamish在下面的评论中指出的那样,我们可以使用let masterA = [4, 5, 2, 1, 7, 8, 1]
let evenA = masterA.enumerated().filter { $0.0 % 2 == 0 }.map{ $0.1 }
let oddA = masterA.enumerated().filter { $0.0 % 2 != 0 }.map{ $0.1 }
print(evenA) // [4, 2, 7, 1]
print(oddA) // [5, 1, 8]
(Swift 3:compactMap
)作为链式flatMap
和filter
的替代方案。
map
后一种let evenA = masterA.enumerated().compactMap { $0 % 2 == 0 ? $1 : nil }
let oddA = masterA.enumerated().compactMap { $0 % 2 != 0 ? $1 : nil }
解决方案更简洁,而compactMap
... filter
解决方案可能显示意图稍微清晰一些。在这个特殊的简短与语义竞争中,我个人更喜欢map
解决方案。
答案 3 :(得分:1)
另一种解决方案
Swift 3.0代码
let array = [1,2,3,4,5,6,7,8]
var oddArray = [Int]()
var evenArray = [Int]()
for (index,value) in array.enumerated() {
if index % 2 == 0 {
// It is odd because index starts from 0 in array and I am assuming the 0 index as the odd one.
oddArray.append(value)
} else {
evenArray.append(value)
}
}
奇数阵= [1,3,5,7]
偶数数组= [2,4,6,8]