数组 – 在Swift中我想将两个序列“连接”到一系列元组中

前端之家收集整理的这篇文章主要介绍了数组 – 在Swift中我想将两个序列“连接”到一系列元组中前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我想加入两个(或更多)序列,然后创建一系列元组.第一个元组包含每个序列的第一个元素,第二个元组包含第二个元素等等……下面是一个示例函数,它接受两个数组并创建第三个元组数组.然后我可以使用此序列来处理map(),filter()和reduce()函数.

我的例子有效,但缺乏多种方式.它适用于不适用于所有序列的数组,当第一个序列用完元素时,它会停止生成元组.我希望nils能够在元组中找到不能再提供元素的短序列.它只适用于两个数组,我希望它适用于任意数量的序列,

部分解决方案会有所帮助.我是一个功能性编程新手,所以这个功能的正确名称也将受到赞赏.也许它已经在switfz库中我只知道它叫什么.我选择了“join”,因为它大致类似于sql“join”,它也构建了元组(a.k.a. rows)

  1. func join<T> (s1: Array<T>,s2: Array<T>) -> Array<(T,T)> {
  2.  
  3. var g1 = s1.generate();
  4. var g2 = s2.generate();
  5.  
  6. var result:Array<(T,T)> = []
  7.  
  8. while let e1 = g1.next() {
  9.  
  10. if let e2 = g2.next() {
  11. result.append((e1,e2))
  12. }
  13. }
  14. return result
  15. }
  16.  
  17.  
  18. class Hamming {
  19. class func compute(input: String,against: String) -> Int {
  20. return join(Array(input),Array(against)).reduce(0){ return ($1.0 != $1.1) ? $0 + 1 : $0 }
  21. }
  22. }
  23.  
  24. Hamming.compute("abcde","abcdf") // 1
已有一个名为Zip2的函数
  1. var first = [0,1,2,3]
  2. var second = ["zero","one","two","three"]
  3.  
  4. Array(Zip2(first,second))
  5. // (0,"zero"),(1,"one"),(2,"two"),(3,"three")

但是这个函数不用nil填充,它也使用两个传递顺序中最短的函数.请注意,它不要求两个序列之间的类型匹配,并且它需要任何序列,而不仅仅是数组.

这是我自己的Zip2WithNilPadding自定义实现:

  1. struct Zip2WithNilPadding<T: SequenceType,U: SequenceType>: SequenceType {
  2. typealias Generator = GeneratorOf<(T.Generator.Element?,U.Generator.Element?)>
  3.  
  4. let first: T
  5. let second: U
  6.  
  7. init(_ first: T,_ second: U) {
  8. self.first = first
  9. self.second = second
  10. }
  11.  
  12. func generate() -> Generator {
  13. var generator1: T.Generator? = first.generate()
  14. var generator2: U.Generator? = second.generate()
  15.  
  16. return GeneratorOf<(T.Generator.Element?,U.Generator.Element?)>() {
  17. let element1 = generator1?.next()
  18. let element2 = generator2?.next()
  19. if element1 == nil && element2 == nil {
  20. return nil
  21. }
  22. else if element1 == nil{
  23. generator1 = nil
  24. }
  25. else if element2 == nil {
  26. generator2 = nil
  27. }
  28. return (element1,element2)
  29. }
  30. }
  31. }
  32.  
  33. var first = [0,2]
  34. var second = ["zero","three","four"]
  35. Array(Zip2WithNilPadding(first,second))

如果您对具体实施有疑问,请告诉我,我会尽力澄清.此实现还应该帮助您创建一个采用序列数组的Zip.不幸的是,在这种情况下,它们都必须是相同类型的序列,因为你不能拥有可变数量的泛型.

猜你在找的Swift相关文章