zoukankan      html  css  js  c++  java
  • 《Programming in Lua 3》读书笔记(十六)

    日期:2014.7.23

    PartⅢ The Standard Libraries

    20 The Table Library

    table库包含一些辅助函数用以类似与数组一样操作table。提供了从list内插入和删除元素的操作,对数组的元素进行排序的操作,将table中所有的string连接起来的操作。

    20.1 Insert and Remove
    Insert
    table的insert操作有三个参数:要被插入数据的table;插入的位置;插入的值。如果插入的位置不是最后一个,那么lua会将该位置至最后一个位置的元素的位置后移一位,如:当前table的t = {10,20,30},此时执行table.insert(t,1,25),即在t的第一个位置插入数据25,得到的结果为 t = {25,10,20,30},位置1及之后的数据位置后移,然后将新的元素插入至1号位置。假如没有提供要插入的位置这个参数,那么默认插入的位置是table的最后的位置,此时不需要移动其他的元素。
    Remove
    table的remove操作将会移除table中给定位置的一个元素,在这位置之后的元素位置前移,如果没有提供需要移除的位置这个参数,则默认移除最后一个元素。
    使用这两个运算函数便可以直观的实现栈、队列、双端队列。使用table初始化一个数据结构,t = {},在尾部添加元素:table.insert(t,x);删除尾部的元素:table.remove(t);由于table库是以c语言来实现这两个函数的,所以在效率上是有保障的。


    20.2 Sort
    table.sort函数。该函数的参数有两个,一个为需要排序的table,另一个是提供排序规则的函数。排序函数需要有两个参数,并且当第一个参数达到了排序规则的要求(假如递增排序的情况,第一个参数大于了第二个参数),那么此时就需要返回true。
    遍历数组的时候推荐使用ipairs而不是pairs,因为前者以1、2、3的顺序遍历,而后者是以任意的顺序来遍历的。
    当我们需要对table的目录进行排序的时候,需要将这些目录首先存储至一个数组,然后再对数组进行排序。因为table中的目录没有顺序可言。
    e.g.
    lines = {
         luaH_set = 10,
         luaH_get = 23,
         luaH_present = 48,
    }
    table.sort( lines )
    for n in pairs(lines) do
         print(n)
    end
    此时打印出来的是:luaH_set、luaH_present、luaH_get,并没有按照顺序来排列
    e.g.
    a = {}
    for n in pairs(lines) do
         a[#a + 1] = n
    end
    table.sort(a)
    for _, n in ipairs(a) do
         print(n)
    end
    此时打印出来的是:luaH_get、luaH_present、luaH_set,此时便是按照字典顺序对table的目录进行了排序。
    使用迭代器来实现排序:
    function pairsByKeys( t,f )          --参数f可以提供自定义的排序方法
         local a = {}
         for n in pairs(t) do
              a[#a + 1] = n
         end
         table.sort(a,f)
         local i = 0
         return function (  )
              i = i + 1
              return a[i],t[a[i]]
         end
    end
    
    for name,line in pairsByKeys(lines) do
         print(name,line)
    end


    20.3 Concatenation
    使用table.concat函数将一串string型变量作为参数,返回的结果是将这些string型变量连接起来。接受一个额外参数作为每个string型变量直接的连接符,默认是没有的。该函数也接受额外的两个参数:用来指定返回结果的第一个和最后一个string型变量。
    下面这个函数
    function rconcat( l , s)
         if type(l) ~= "table" then return l end
         local res = {}
         for i = 1,#l do    
              res[i] = rconcat(l[i])
         end
         return table.concat(res)
    end

    所实现的功能是将一个嵌套多个table的table进行连接,返回连接结果。
  • 相关阅读:
    Android UI--自定义ListView(实现下拉刷新+加载更多)
    12306火车票订票网站的一个Bug
    golang中赋值string到array
    Node.js学习(14)----EJS模板引擎
    操作系统
    springMVC学习笔记--初识springMVC
    sqlplus 连接数据库报错SP2-0642: SQL*Plus internal error state 2130, context 0:0:0
    对于事务和同步(并发)的简要理解
    Jsoup入门
    [LeetCode]Single Number
  • 原文地址:https://www.cnblogs.com/zhong-dev/p/4044569.html
Copyright © 2011-2022 走看看