zoukankan      html  css  js  c++  java
  • chapter11_3 字符串缓冲

      逐行地读取一个文件,典型的代码是:

    local buff= " "
    for line in io.lines() do
        buff = buff .. line .. "
    "
    end

    这段代码看似可以正常工作,但是如果面对较大的文件时,性能开销极大。

    Lua提供了io.read("*a")选项,这样可以一次性读取整个文件。

    在Lua中,可以将一个table作为字符串缓冲。关键是使用函数table.concat,它将给定列表中的所有字符串连接起来,并返回结果。

    用concat来重写上述循环:

    local t = {}
    for line in io.lines() do
        t[#t + 1] = line .. "
    "
    end
    local s = table.concat(t)

    之前的代码处理350k的文件需要1分钟,而这个实现只需花小于0.5秒的时间。

    concat函数还有第二个可选的参数,可以指定一个插在字符串间的分隔符,有了这个分隔符,就不必在每行后插入一个“ ”了。

    local t = {}
    for line in io.lines() do
        t[#t + 1] = line
    end
    s = table.concat(t,"
    ") .. "
    "  --需要在最后的结尾添加一个"
    "

    上面的最后一行需要复制整个结果字符串,而这时的字符串也已经相当长了。

    没有直接的选项让concat插入这个额外的分隔符,不过可以“欺骗”concat,只需要在t后面添加一个空字符串:

    local t = {}
    for line in io.lines() do
        t[#t + 1] = line
    end
    t[#t + 1] = ""        --用空字符串 欺骗concat
    s = table.concat(t,"
    ")

    concat在空字符串前插入了这个额外的换行符,位于结果字符串的末尾。

  • 相关阅读:
    单链表的基本操作(查找,插入,删除)
    线性表的基本操作(插入,删除,查找)
    双人五子棋对战(需要EasyX图像库)
    2016ACM竞赛训练暑期课期末考试 a题
    百练_1664 放苹果
    百练_4120 硬币(DP)
    PAT_1046 划拳
    PAT_1026 程序运行时间
    学Android开发 这19个开发工具助你顺风顺水
    JAVA利用axis2发布webservice
  • 原文地址:https://www.cnblogs.com/daiker/p/5832876.html
Copyright © 2011-2022 走看看