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 + 随机数代码简洁随机性不够均匀,效率略低快速简单场景

注意事项

  1. 深拷贝数组:如果不想修改原数组,使用 const copy = [...array]array.slice() 创建副本。
  2. 随机性质量Math.random() 生成的随机数在大多数场景下足够用,但如需更高安全性,可考虑使用加密安全的随机数生成器。
  3. 性能:对大型数组(如 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);
posted @ 2025-02-13 14:23  jio-deng  阅读(138)  评论(0)    收藏  举报  来源