模拟 数组的三个强大功能

作者: 查无此人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个小时了,脖子和背疼的不行不行的....

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

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

    加油吧~

相关文章

  • 模拟 数组的三个强大功能

    filter 过滤let newArray = anArray.filter {$0 > 50}过滤anArray...

  • 软件性能测试Ⅴ

    VU——用户行为的模拟器 LoadRunner之所以强大,很大原因是VU的功能强大。VU几乎支持模拟当今所有主流的...

  • 外汇看盘软件mt4有什么功能?详解外汇软件mt4

    MT4的功能异常强大,可以即时查看黄金、白银、外汇、股票、期货等行情,同时可以进行模拟交易,功能特别强大,是目前最...

  • RetroArch 简介

    RetroArch 是款功能强大的跨平台模拟器,不但能够模拟许多不同的游戏主机,还能在 Windows、MacOS...

  • numpy基础:索引

    数组索引是指使用方括号([])对数组值进行索引。有很多选项来索引,这使numpy索引很强大,但功能上的强大也带来一...

  • vector, deque 与 list

    首先是vector,字面翻译为向量,其用法类似于数组,但其功能比数组更强大。简单的说,vector是数组的类表示,...

  • Android ADB常用

    ADB是个强大的调试工具,如果你有root权限,就掌控了整个手机。 模拟按键 模拟点击(单击) 开发最重要功能,抓...

  • PowerMock 笔记

    PowerMock 简介 PowerMock 是一个框架,它以更强大的功能扩展了其他模拟库,如 EasyMock ...

  • javascript数组之splice方法

    splice() 这个方法在数组中功能还是相当强大的。 splice()的主要用途是向数组的中部插入项,但使用这种...

  • 一个轻巧强大的服务端接口模拟桌面软件

    easyserver 一个轻巧但是功能强大的模拟服务器桌面程序。 https://github.com/xingl...

网友评论

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

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