ArkTs-打乱array数组
在 ArkTS(基于 TypeScript 的华为 HarmonyOS 开发框架)中,打乱数组顺序可以通过 Fisher-Yates 洗牌算法 或 sort 结合随机数 实现。以下是两种方法的详细实现和示例:
方法 1:Fisher-Yates 洗牌算法(推荐)
这是最经典、效率最高的打乱数组算法,时间复杂度为 O(n),且能保证均匀随机性。
// 定义工具函数
function shuffleArray<T>(array: T[]): T[] {
const shuffled = [...array]; // 创建数组副本(避免修改原数组)
for (let i = shuffled.length - 1; i > 0; i--) {
const j = Math.floor(Math.random() * (i + 1)); // 生成随机索引 [0, i]
[shuffled[i], shuffled[j]] = [shuffled[j], shuffled[i]]; // 交换元素
}
return shuffled;
}
// 示例用法
let originalArray: number[] = [1, 2, 3, 4, 5];
let shuffledArray = shuffleArray(originalArray);
console.log(shuffledArray); // 输出随机顺序,如 [3, 1, 5, 2, 4]
方法 2:sort + 随机数(简单但不够均匀)
通过 sort 方法结合随机数比较函数,虽然代码简洁,但随机性不够严格(某些元素可能更频繁出现在特定位置)。
// 直接操作原数组(如需保留原数组,请先拷贝)
let array: number[] = [1, 2, 3, 4, 5];
array.sort(() => Math.random() - 0.5);
console.log(array); // 输出随机顺序,如 [2, 5, 1, 4, 3]
两种方法对比
| 方法 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| Fisher-Yates | 均匀随机,时间复杂度低 | 代码稍长 | 需要严格随机性 |
sort + 随机数 | 代码简洁 | 随机性不够均匀,效率略低 | 快速简单场景 |
注意事项
- 深拷贝数组:如果不想修改原数组,使用
const copy = [...array]或array.slice()创建副本。 - 随机性质量:
Math.random()生成的随机数在大多数场景下足够用,但如需更高安全性,可考虑使用加密安全的随机数生成器。 - 性能:对大型数组(如 10,000+ 元素)优先选择 Fisher-Yates 算法。
封装成工具函数(推荐)
将 Fisher-Yates 算法封装为工具函数,方便复用:
// 工具类:ArrayUtils.ets
export class ArrayUtils {
static shuffle<T>(array: T[]): T[] {
const shuffled = [...array];
for (let i = shuffled.length - 1; i > 0; i--) {
const j = Math.floor(Math.random() * (i + 1));
[shuffled[i], shuffled[j]] = [shuffled[j], shuffled[i]];
}
return shuffled;
}
}
// 使用示例
import { ArrayUtils } from './ArrayUtils';
let numbers = [1, 2, 3, 4, 5];
let randomNumbers = ArrayUtils.shuffle(numbers);

浙公网安备 33010602011771号