一、字符串与数组的双向转换数组与字符串之间的转换是数据持久化的基础操作。将数组元素连接成一个字符串便于存储和传输将字符串按特定分隔符拆分回数组则恢复了数据的可用形态。join 方法将数组所有元素连接为字符串默认以逗号分隔。toString 方法也能达到类似效果但 join 更灵活可以指定自定义分隔符。这种转换在存档系统中经常使用——复杂的数据结构先转为字符串保存读取时再还原。split 是字符串的方法而非数组方法它将字符串按指定分隔符拆分为字符串数组。拆分后的元素仍是字符串类型若需要数值运算需逐个转换为数字。这种类型转换在 TypeScript 中可以通过加号前缀快速完成前提是字符串内容本身为数字格式。二、数组两端操作的语义区分数组在尾部和头部的操作具有不同的数据结构语义。push 和 pop 在尾部进行增删这是栈的后进先出模式unshift 和 shift 在头部进行增删前者在头部插入元素使后续索引后移后者从头部移除元素。push 与 pop 的组合构成栈push 与 shift 的组合构成队列。同一个数组通过选择不同的方法组合可以模拟不同的数据结构行为这是 TypeScript 数组灵活性的体现。三、多维数组的初始化层次多维数组的理解可以降维处理二维数组是存放一维数组的数组三维数组是存放二维数组的数组以此类推。初始化时必须逐层进行外层数组初始化后内层每一维都需要单独实例化否则访问元素时会因未定义而报错。常见的错误是只初始化了最外层维度直接访问内层元素时遇到空引用。报错信息中若出现 set 或索引相关的异常大概率与数组未完整初始化有关。养成逐层初始化的习惯可以避免这类问题。四、洗牌算法的实现思路洗牌算法的核心是将有序数组转化为无序数组。其实现过程体现了算法设计的一般方法先手动完成前几步操作观察规律再将重复步骤抽象为循环。具体做法是维护一个有序部分和一个无序部分。每次在有序部分中随机选取一个元素与有序部分的最后一个元素交换随后有序部分缩小、无序部分扩大。重复此过程直到所有元素都进入无序部分。随机选取保证了每个元素出现在任意位置的概率均等算法的公平性由此得到保障。五、选择排序的基本原理排序算法与洗牌算法在交换操作上具有相似性但目标相反洗牌是将有序变为无序排序是将无序变为有序。选择排序的思路是维护一个无序部分和一个有序部分。每次从无序部分找出最大元素与无序部分的最后一个元素交换该元素即成为有序部分的新成员。无序部分逐渐缩小有序部分逐渐扩大直至整个数组有序。实现时同样可以先完成前几步手动操作发现索引变化的规律后用循环变量替代固定的偏移值。算法优化是后续考虑的事情首要任务是保证正确性。六、字符串索引与资源管理数组的索引不仅可以是数字也可以是字符串。这种特性让数组可以像哈希表一样工作用有意义的字符串作为键来存取数据而非依赖难以记忆的数字索引。在游戏开发中这种机制特别适合资源管理。每个资源文件有唯一的名字将资源对象以名字为键存入数组后续使用时直接通过名字访问避免了遍历查找或硬编码索引。音乐的缓存、图片的缓存都可以采用这种方式——按名字索引按名字调用。批量导入资源时可以利用编辑器的多选功能一次性将同类资源加入数组。在代码中遍历这些资源以资源名字作为索引存入另一个数组即完成了资源的快速索引构建。后续根据数据值拼接出对应的名字就能直接获取到正确的资源对象。七、牌型判断的计数思路在需要统计元素出现次数的场景中可以用一个计数数组来记录。将元素的值映射为计数数组的索引每次遇到该元素就在对应位置累加。遍历完成后计数数组中每个位置的值即表示原元素出现的次数。这种计数方式将复杂的统计问题转化为简单的数组索引操作。基于计数结果可以进一步判断连续出现的情况——连续的计数大于一表示有连对连续的五次以上表示有顺子某个计数等于四表示有炸弹。牌型判断的复杂度由此大幅降低。
Cocos学习笔记:数组算法与资源索引机制
一、字符串与数组的双向转换数组与字符串之间的转换是数据持久化的基础操作。将数组元素连接成一个字符串便于存储和传输将字符串按特定分隔符拆分回数组则恢复了数据的可用形态。join 方法将数组所有元素连接为字符串默认以逗号分隔。toString 方法也能达到类似效果但 join 更灵活可以指定自定义分隔符。这种转换在存档系统中经常使用——复杂的数据结构先转为字符串保存读取时再还原。split 是字符串的方法而非数组方法它将字符串按指定分隔符拆分为字符串数组。拆分后的元素仍是字符串类型若需要数值运算需逐个转换为数字。这种类型转换在 TypeScript 中可以通过加号前缀快速完成前提是字符串内容本身为数字格式。二、数组两端操作的语义区分数组在尾部和头部的操作具有不同的数据结构语义。push 和 pop 在尾部进行增删这是栈的后进先出模式unshift 和 shift 在头部进行增删前者在头部插入元素使后续索引后移后者从头部移除元素。push 与 pop 的组合构成栈push 与 shift 的组合构成队列。同一个数组通过选择不同的方法组合可以模拟不同的数据结构行为这是 TypeScript 数组灵活性的体现。三、多维数组的初始化层次多维数组的理解可以降维处理二维数组是存放一维数组的数组三维数组是存放二维数组的数组以此类推。初始化时必须逐层进行外层数组初始化后内层每一维都需要单独实例化否则访问元素时会因未定义而报错。常见的错误是只初始化了最外层维度直接访问内层元素时遇到空引用。报错信息中若出现 set 或索引相关的异常大概率与数组未完整初始化有关。养成逐层初始化的习惯可以避免这类问题。四、洗牌算法的实现思路洗牌算法的核心是将有序数组转化为无序数组。其实现过程体现了算法设计的一般方法先手动完成前几步操作观察规律再将重复步骤抽象为循环。具体做法是维护一个有序部分和一个无序部分。每次在有序部分中随机选取一个元素与有序部分的最后一个元素交换随后有序部分缩小、无序部分扩大。重复此过程直到所有元素都进入无序部分。随机选取保证了每个元素出现在任意位置的概率均等算法的公平性由此得到保障。五、选择排序的基本原理排序算法与洗牌算法在交换操作上具有相似性但目标相反洗牌是将有序变为无序排序是将无序变为有序。选择排序的思路是维护一个无序部分和一个有序部分。每次从无序部分找出最大元素与无序部分的最后一个元素交换该元素即成为有序部分的新成员。无序部分逐渐缩小有序部分逐渐扩大直至整个数组有序。实现时同样可以先完成前几步手动操作发现索引变化的规律后用循环变量替代固定的偏移值。算法优化是后续考虑的事情首要任务是保证正确性。六、字符串索引与资源管理数组的索引不仅可以是数字也可以是字符串。这种特性让数组可以像哈希表一样工作用有意义的字符串作为键来存取数据而非依赖难以记忆的数字索引。在游戏开发中这种机制特别适合资源管理。每个资源文件有唯一的名字将资源对象以名字为键存入数组后续使用时直接通过名字访问避免了遍历查找或硬编码索引。音乐的缓存、图片的缓存都可以采用这种方式——按名字索引按名字调用。批量导入资源时可以利用编辑器的多选功能一次性将同类资源加入数组。在代码中遍历这些资源以资源名字作为索引存入另一个数组即完成了资源的快速索引构建。后续根据数据值拼接出对应的名字就能直接获取到正确的资源对象。七、牌型判断的计数思路在需要统计元素出现次数的场景中可以用一个计数数组来记录。将元素的值映射为计数数组的索引每次遇到该元素就在对应位置累加。遍历完成后计数数组中每个位置的值即表示原元素出现的次数。这种计数方式将复杂的统计问题转化为简单的数组索引操作。基于计数结果可以进一步判断连续出现的情况——连续的计数大于一表示有连对连续的五次以上表示有顺子某个计数等于四表示有炸弹。牌型判断的复杂度由此大幅降低。