模拟 数组的三个强大功能

作者: 查无此人123 | 来源:发表于2016-08-13 16:40 被阅读107次
    1. filter 过滤
      let newArray = anArray.filter {$0 > 50}
      

      过滤anArray里的值,生成一个满足条件的新数组

      模拟数组过滤代码实现
      extension Array {
        mutating func anFilter(someFunction:(Element) -> Bool) -> Array? {
          if self.isEmpty{
            return nil
          }
          
          var newArray = Array()
          
          for element in self {
            if someFunction(element) == true {
              newArray.append(element)
            }
          }
          return newArray
        }
      }
      
      var a = [3,4,5,6,7]
      let b = a.anFilter{$0 > 4}
      print(b)
      //Optional([5,6,7])
      

    这里我是利用刚学的extension对数组进行了扩展,然后模拟了一个过滤的代码,虽然最后生成的是个Optional,但基本已经达到目的了,好激动的说,哈哈哈~

    传入一个(Element) -> Bool型的函数,用来在我扩展的这个anFilter函数里判断数组的每个元素是否满足我传入的这个函数的要求,满足返回真,并把满足条件的元素放入一个新的数组,最后把这个新的数组传出来。

    这里用到了两个新知识点

    一个是传入的函数的(Element) -> Bool这个Element实际上是 <u>泛类型</u> ,可以指代Int啊String啊Double啊等各种

    另一个是该扩展方法前的mutating关键字,刚好我在总结上一篇<u>Extension</u>学到了这个关键字,这个关键字是在给结构体(Structure)或枚举(Enumeration)扩展需要改变自己的实例方法的时候使用的,这隐隐的让我感觉到(貌似在哪看到过),数组(Array)本质上就是个结构体(Structure)

    1. map 映射
      let newArray = array.map { $0 / 2}
      

      anArray的所有元素进行更改

      模拟数组映射代码实现
      extesion Array {
        mutating func aMap(someFunction:(Element) -> Element) -> Array? {
          if self.isEmpty {
            return = nil
          }
          
          var newArray = Array()
          
          for element in self {
            let newElement = someFunction(elemtn)
            newArray.append(newElement)
          }
          return newArray
        }
      }
      var a = [3,4,5,6,7]
      let b = a.aMap{ $0 * 2}
      print(b)
      // Optional([6,8,10,12,14])
      

    这个原理和实现基本和上面是一致的,这个就是把数组的每个元素都拿出来,挨个做someFunction(Element) -> Element的运算,生成一个新的元素,然后全部放在一个新的数组里,返回给我们.

    1. reduce 缩减
      let newArray = anArray.reduce(0, combine: +)
      

      anArray里的元素整体进行合并,缩减,第一个数(0,还可以写别的)是起始数,在起始数的基础上,在后面依次对它们进行类叠运算

      模拟数组缩减代码实现
      extension Array {
        mutating func aReduce(first: Element, someFunction: (Element, Element) -> Element) -> Element {
          var index = 0
          var current = first
          while index < self.count {
            current = someFunction(current, self[index])
            index += 1
          }
          return current
        }
      }
      var a = [1,2,3,4,5]
      let b = a.aReduce(1,someFunction: +)
      print(b)
      

      哈哈,写完了

      总结

      这不能算是完全原创啦,因为在网上看算法相关内容的时候,有看到别人在链表里模拟过映射和过滤,灵感也是来源于此啦,本来也只是想试一试,没想到,靠着刚学到的知识,刚刚好可以写出来,非常兴奋那哈哈哈

      这也算是我的一个小小的「成就动机」啦。不知不觉一动不动的2个小时了,脖子和背疼的不行不行的....

      不过,站在这个人生的转折点上,又让我想到了那三个关键词:

      「大量投入」「反复练习」「隐性牺牲」

      加油吧~

    相关文章

      网友评论

        本文标题:模拟 数组的三个强大功能

        本文链接:https://www.haomeiwen.com/subject/eetysttx.html