Swift 相当于 Ruby 的 "each_cons"
Swift equivalent of Ruby's "each_cons"
Ruby
Ruby有each_cons可以这样使用
class Pair
def initialize(left, right)
@left = left
@right = right
end
end
votes = ["a", "b", "c", "d"]
pairs = votes.each_cons(2).map { |vote| Pair.new(*vote) }
p pairs
# [#<Pair @left="a", @right="b">, #<Pair @left="b", @right="c">, #<Pair @left="c", @right="d">]
Swift
swift 中的相同代码,但没有 each_cons
函数
struct Pair {
let left: String
let right: String
}
let votes = ["a", "b", "c", "d"]
var pairs = [Pair]()
for i in 1..<votes.count {
let left = votes[i-1]
let right = votes[i]
pairs.append(Pair(left: left, right: right))
}
print(pairs)
// [Pair(left: "a", right: "b"), Pair(left: "b", right: "c"), Pair(left: "c", right: "d")]
如何使这个 swift 代码更短或更简单?
zip(votes, votes.dropFirst())
这会产生一个元组序列。
示例
struct Pair {
let left: String
let right: String
}
let votes = ["a", "b", "c", "d"]
let pairs = zip(votes, votes.dropFirst()).map {
Pair(left: [=11=], right: )
}
print(pairs)
// [Pair(left: "a", right: "b"), Pair(left: "b", right: "c"), Pair(left: "c", right: "d")]
这是我想出的一般解决方案,但它似乎效率低得可怕。要实施 each_cons(n)
,请将我的 clump
设置为 n
:
let arr = [1,2,3,4,5,6,7,8]
let clump = 2
let cons : [[Int]] = arr.reduce([[Int]]()) {
memo, cur in
var memo = memo
if memo.count == 0 {
return [[cur]]
}
if memo.count < arr.count - clump + 1 {
memo.append([])
}
return memo.map {
if [=10=].count == clump {
return [=10=]
}
var arr = [=10=]
arr.append(cur)
return arr
}
}
Ruby
Ruby有each_cons可以这样使用
class Pair
def initialize(left, right)
@left = left
@right = right
end
end
votes = ["a", "b", "c", "d"]
pairs = votes.each_cons(2).map { |vote| Pair.new(*vote) }
p pairs
# [#<Pair @left="a", @right="b">, #<Pair @left="b", @right="c">, #<Pair @left="c", @right="d">]
Swift
swift 中的相同代码,但没有 each_cons
函数
struct Pair {
let left: String
let right: String
}
let votes = ["a", "b", "c", "d"]
var pairs = [Pair]()
for i in 1..<votes.count {
let left = votes[i-1]
let right = votes[i]
pairs.append(Pair(left: left, right: right))
}
print(pairs)
// [Pair(left: "a", right: "b"), Pair(left: "b", right: "c"), Pair(left: "c", right: "d")]
如何使这个 swift 代码更短或更简单?
zip(votes, votes.dropFirst())
这会产生一个元组序列。
示例
struct Pair {
let left: String
let right: String
}
let votes = ["a", "b", "c", "d"]
let pairs = zip(votes, votes.dropFirst()).map {
Pair(left: [=11=], right: )
}
print(pairs)
// [Pair(left: "a", right: "b"), Pair(left: "b", right: "c"), Pair(left: "c", right: "d")]
这是我想出的一般解决方案,但它似乎效率低得可怕。要实施 each_cons(n)
,请将我的 clump
设置为 n
:
let arr = [1,2,3,4,5,6,7,8]
let clump = 2
let cons : [[Int]] = arr.reduce([[Int]]()) {
memo, cur in
var memo = memo
if memo.count == 0 {
return [[cur]]
}
if memo.count < arr.count - clump + 1 {
memo.append([])
}
return memo.map {
if [=10=].count == clump {
return [=10=]
}
var arr = [=10=]
arr.append(cur)
return arr
}
}