zoukankan      html  css  js  c++  java
  • lua表排序

    对于lua的table排序问题,一般的按照value值来排序,使用table.sort( needSortTable , func)即可(可以根据自己的需要重写func,否则会根据默认来:默认的情形之下,如果表内既有string,number类型,则会因为两个类型直接compare而出错,所以需要自己写func来转换一下;也可根据自己的需要在此func中 添加相应的逻辑来达到你的 排序要求);

    local test_table = {2,1,3,"SORT","sort"}  
    table.sort(test_table , function(a , b)
            return tostring(a) > tostring(b)
        end)  
    for key,value in pairs(test_table) do  
        print(key,value)  
    end  
    
    -- 输出如下:
    1    sort
    2    SORT
    3    3
    4    2
    5    1

    若要进行对表进行按照 键值对key值来进行排序,只是输入的话,目测可以这样:

    local test_table = {a=3,b=2,c=4,d=1}  
    local key_table = {}  
    --取出所有的键  
    for key,_ in pairs(test_table) do  
        table.insert(key_table,key)  
    end  
    --对所有键进行排序  
    table.sort(key_table)  
    for _,key in pairs(key_table) do  
        print(key,test_table[key])  
    end

    但是这样子仅仅能够使得print输入时达到这个目的,而table本身并没有因此而改变,所以这样是不可取的; 我们可以改变泛型for的迭代因子来达到这个目的的:

    function ipairs2(a)
        return iter,a,0
    end
    
    local function iter(a, i)
        i = i + 1
        local v = a[i]
        if v then
            return i, v
        else
            return nil, nil
        end
    end
    
    a = {"one","two","three"}
    for k,v in ipairs2(a) do
        print(k, v)
    end
    --输出结果为:
    --1       one
    --2       two
    --3       three

    如此是达到我们的目的了,但是这个只能支持下表为整形的table(即是 放在table数组部分的表,hash部分却未能为力);所以需要类似这样子:

    lines = {
        name = "jeff",
        {"pairsByKeys"},
        luaH_set = 10,
        luaH_get = 24,
        luaH_present = 48,
    }
    
    function pairsByKeys(t, f)
        local a = {}
        for n in pairs(t) do table.insert(a, n) end
        table.sort(a, f)
        local i = 0                 -- iterator variable
        local iter = function ()    -- iterator function
           i = i + 1
           if a[i] == nil then return nil
           else return a[i], t[a[i]]
           end
        end
        return iter
    end
    
    function sortFunc(a , b)
        if tostring(a) > tostring(b) then 
            return true
        end
    end
    
    for name, line in pairsByKeys(lines , sortFunc) do
        print(name, line)
    end

    输出地结果如下:

    name    jeff
    luaH_set    10
    luaH_present    48
    luaH_get    24
    1    table: 027EE6E8
    [Finished in 0.1s]

    如此这般 即可实现表按照键值对的排序了;这样的实现方式其实与上述将table的索引存入一个temp表中,并将此temp表按func排序;只不过这里 使用闭包,将此处理放置在了一个方法内来替代pairs罢了;

    关于泛型for的文章,可参看这边文章:Click Here 

    参考Bolg : Click Here

  • 相关阅读:
    使用Springsecurity3.0 框架
    Spring3.0.2 使用全Annotation 与 Hessian 兼容配置
    Python Study PyCharm License
    Spring3.0.2 使用 Annotation 与 @Transactional 冲突问题解决方案
    「JOI 2014 Final」裁剪线
    CF700E Cool Slogans
    「JOISC 2014 Day4」两个人的星座
    ABC231H(二分图最小权边覆盖)
    JOISC 2017
    博弈论 初步
  • 原文地址:https://www.cnblogs.com/jadeboy/p/4101732.html
Copyright © 2011-2022 走看看