Swift&Objective-C程序员iOS Developer

模拟 数组的三个强大功能

2016-08-13  本文已影响107人  查无此人123
  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个小时了,脖子和背疼的不行不行的....

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

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

    加油吧~

上一篇下一篇

猜你喜欢

热点阅读