排行榜:

key:玩家名字,val:玩家的数值

  1. local key1 = {"a1", "a2", "b1", "b2", "a3"}
  2. local val1 = {, , , , }
  3. local key2 = {"b1", "a", "a2", "b2"}
  4. local val2 = {, , , }

val1:原排行榜中的数值,已排序(从小到大)

key1:原排行榜val已排序的数值对应的名字

key2, val2为新的数据,两组数据合并为一组,相同名字的数值合并取最小(或最大)

采用归并排序

迭代法步骤:

1. 申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列

2. 设定两个指针,最初位置分别为两个已经排序序列的起始位置

3. 比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置

4. 重复步骤3直到某一指针达到序列尾

5. 将另一序列剩下的所有元素直接复制到合并序列尾

递归法

原理如下(假设序列共有n个元素):

  1. 将序列每相邻两个数字进行归并操作,形成个序列,排序后每个序列包含两个元素
  2. 将上述序列再次归并,形成个序列,每个序列包含四个元素
  3. 重复步骤2,直到所有元素排序完毕

动态图:

又因旧排行榜数据和新排行榜数据已经是两个已经有序的数列,就不用再分了。但需要合并相同名字的数据只保留一份

使用协程合并:

  1. local keys, vals = {}, {}
  2. -- 创建协程
  3. local function createCo(keys, values)
  4. return coroutine.create(
  5. function ()
  6. for i, v in ipairs(values or {}) do
  7. coroutine.yield(keys[i], v)
  8. end
  9. end
  10. )
  11. end
  12. -- 插入到结果中并唤醒协程
  13. local function insertResultAndResume(key, val, co)
  14. for _, v in next, keys do
  15. if v == key then
  16. return coroutine.resume(co)
  17. end
  18. end
  19. table.insert(keys, key)
  20. table.insert(vals, val)
  21. return coroutine.resume(co)
  22. end
  23. local co1, co2 = createCo(key1, val1), createCo(key2, val2)
  24. local r1, k1, v1 = coroutine.resume(co1)
  25. local r2, k2, v2 = coroutine.resume(co2)
  26.  
  27. while v1 and v2 do
  28. if v1 > v2 then
  29. r2, k2, v2 = insertResultAndResume(k2, v2, co2)
  30. else
  31. r1, k1, v1 = insertResultAndResume(k1, v1, co1)
  32. end
  33. end
  34. while v1 do
  35. r1, k1, v1 = insertResultAndResume(k1, v1, co1)
  36. end
  37. while v2 do
  38. r2, k2, v2 = insertResultAndResume(k2, v2, co2)
  39. end
  40.  
  41. print("-------result--------")
  42. for i, v in pairs(keys) do
  43. print(v, "= ", vals[i])
  44. end

-- 打印结果为:

  1. -------result--------
  2. a1 =
  3. b1 =
  4. a2 =
  5. b2 =
  6. a3 =

Lua 排行榜更新的更多相关文章

  1. Lua热更新时正确设置文件名

    Lua热更新时正确设置文件名(金庆的专栏 2016.12)Lua热更新模块见:https://github.com/jinq0123/hotfix其中使用 load(chunk) 来加载更新后的内容, ...

  2. Lua热更新(hotfix)

    Lua热更新(hotfix)(金庆的专栏)hotfixLua 5.2/5.3 hotfix. Hot update functions and keep old data.https://github ...

  3. 出售一套Unity + Lua热更新框架代码

    出售一套Unity + Lua的客户端框架代码,功能有资源管理.网络通信.配置文件解析.热更新.文件读写.Lua加密揭秘.UI框架.打包工具.编辑器工具等,已经在多个实际项目(已上线)中使用.代码优雅 ...

  4. (原创)cocos lua 热更新从零开始(一)最简单demo

    开发环境:WIN7 + cocos2dx 3.10 lua版本 0.学习这篇内容的基础是你要会创建并运行一个cocos lua项目 1.热更新的思想所谓的热更新,就是在线更新代码和资源.热更新的过程首 ...

  5. cocos2dx lua 热更新方案的实现

    (Upgrade.h) #include <stdio.h> #include "cocos2d.h" #include "framework/utils/U ...

  6. Lua------------------unity与lua的热更新

    [Unity3D]Unity3D游戏开发之Lua与游戏的不解之缘终结篇:UniLua热更新完全解读 标签: 游戏开发游戏解决方案用户体验unity3d 2014-10-18 23:23 7680人阅读 ...

  7. [Unity3D]Unity3D游戏开发之Lua与游戏的不解之缘终结篇:UniLua热更新全然解读

    ---------------------------------------------------------------------------------------------------- ...

  8. 腾讯开源手游热更新方案,Unity3D下的Lua编程

    原文:http://www.sohu.com/a/123334175_355140 作者|车雄生 编辑|木环 腾讯最近在开源方面的动作不断:先是微信跨平台基础组件Mars宣布开源,腾讯手游又于近期开源 ...

  9. Lua学习笔记(一)-----C#和lua的交互

    一直以来对Lua热更新技术很感兴趣,在上周开始了对Lua的学习,主要学的是uLua. 直接上干货 准备工作: LuaInterface包括两个核心库一个是LuaInterface.dll,一个是Lua ...

随机推荐

  1. session、cookie浅见

    万事开头难,刚开始不一定能写好博文,不,应该是一定写的不好,但我定会用心. 以前只知道session是存在服务器,cookie是存在客户端,至于它们工作的原理就不了解了.为了巩固自己记忆,小小的总结了 ...

  2. canvas画圆(一)

    仿第一次效果

  3. linQ学习笔记之二简单的linq使用

    最基本的Lambda表达式 (参数列表)=>{f方法体} 参数列表中的参数类型可以是明确类型或者是推断类型 如果是推断类型,则参数的数据类型将由编译器根据上下文自动推断出来 linQ to Ob ...

  4. nodejs 笔记

    安装环境----------------------------------------------------------------1,安装nodejs 起步------------------- ...

  5. Android手机刷recovery

    以前觉得android刷机是件很麻烦的事,现在倒不觉得了.  只要手机刷入第三方的recovery,一切都好办了,无论是root还是刷google play.  recovery开源的有两大阵营,tw ...

  6. 《PHP数组函数》笔记

    ① in_array() 检查数组中是否存在某个值;有两个参数,第一个参数是要查找的值,第二个参数是数组名,返回值为布尔,找到则ture否则false; ② array_search 在数组中搜索给定 ...

  7. Asp.Net 数据库连接字符串

    <configuration> <connectionStrings> <add name="DefaultConnection" providerN ...

  8. c语言内存原理

    1.内存寻址由大到小,优先分配内存地址比较大得字节给变量 2.变量越先定义,内存地址就越大 3.取得变量的地址:&变量名 4.输出地址  %p

  9. 第18讲——ActiveX控件

    1,容器应用程序是可以嵌入或链接对象的应用程序.服务器应用程序是创建对象并且当对象被双击时,可以被启动的应用程序. 2,可以安装一个TstCon32来测试ActiveX控件 3,可以用 Invalid ...

  10. 在input中放对象

    var input = $("<input type='hidden' class='hidden-user'/>"); $(input).data("ran ...