aha*_*lls 12 arrays join sequence swift
我想加入两个(或更多)序列,然后创建一系列元组.第一个元组包含每个序列的第一个元素,第二个元组包含第二个元素等等......下面是一个示例函数,它接受两个数组并创建第三个元组数组.然后我可以使用此序列来处理map(),filter()和reduce()函数.
我的例子有效,但缺乏多种方式.它适用于不适用于所有序列的数组,当第一个序列用完元素时,它会停止生成元组.我希望nils能够在元组中找到无法提供元素的短序列.它只适用于两个数组,我希望它适用于任意数量的序列,
部分解决方案会有所帮助.我是一个功能性编程新手,所以这个功能的正确名称也将受到赞赏.也许它已经在switfz库中我只知道它叫什么.我选择了"join",因为它大致类似于SQL"join",它也构建了元组(aka行)
func join<T> (s1: Array<T>, s2: Array<T>) -> Array<(T,T)> {
var g1 = s1.generate();
var g2 = s2.generate();
var result:Array<(T,T)> = []
while let e1 = g1.next() {
if let e2 = g2.next() {
result.append((e1,e2))
}
}
return result
}
class Hamming {
class func compute(input: String, against: String) -> Int {
return join(Array(input),Array(against)).reduce(0){ return ($1.0 != $1.1) ? $0 + 1 : $0 }
}
}
Hamming.compute("abcde","abcdf") // 1
Run Code Online (Sandbox Code Playgroud)
dre*_*wag 15
已经有一个函数被称为Zip2
:
var first = [0,1,2,3]
var second = ["zero", "one", "two", "three"]
Array(Zip2(first,second))
// (0, "zero"), (1, "one"), (2, "two"), (3, "three")
Run Code Online (Sandbox Code Playgroud)
然而,这个函数不用nil填充,它也使用两个传递顺序中最短的.请注意,它不要求两个序列之间的类型匹配,并且它需要任何序列,而不仅仅是数组.
这是我自己的Zip2WithNilPadding自定义实现:
struct Zip2WithNilPadding<T: SequenceType,U: SequenceType>: SequenceType {
typealias Generator = GeneratorOf<(T.Generator.Element?, U.Generator.Element?)>
let first: T
let second: U
init(_ first: T, _ second: U) {
self.first = first
self.second = second
}
func generate() -> Generator {
var generator1: T.Generator? = first.generate()
var generator2: U.Generator? = second.generate()
return GeneratorOf<(T.Generator.Element?, U.Generator.Element?)>() {
let element1 = generator1?.next()
let element2 = generator2?.next()
if element1 == nil && element2 == nil {
return nil
}
else if element1 == nil{
generator1 = nil
}
else if element2 == nil {
generator2 = nil
}
return (element1, element2)
}
}
}
var first = [0,1,2]
var second = ["zero", "one", "two", "three", "four"]
Array(Zip2WithNilPadding(first, second))
Run Code Online (Sandbox Code Playgroud)
如果您对具体实施有疑问,请告诉我,我会尽力澄清.此实现还应该帮助您创建一个采用序列数组的Zip.不幸的是,在这种情况下,它们都必须是相同类型的序列,因为您不能拥有可变数量的泛型.
从Swift 3开始,有一个自由函数用于创建Zip2Sequence:
let s = ["a", "b", "c"]
let n = [1, 2, 3]
let zipped = zip(s, n) // Zip2Sequence<[String], [Int]>
let zippedArray = Array(zipped) // [(String, Int)]
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
6234 次 |
最近记录: |