当前位置:首页 > Java

java数组如何打乱

2026-03-23 08:54:24Java

使用 Collections.shuffle 方法

将数组转换为列表后,利用 Collections.shuffle 方法打乱顺序。此方法适用于对象数组(如 Integer[]String[])。

import java.util.Arrays;
import java.util.Collections;
import java.util.List;

public class ShuffleArray {
    public static void main(String[] args) {
        Integer[] array = {1, 2, 3, 4, 5};
        List<Integer> list = Arrays.asList(array);
        Collections.shuffle(list);
        System.out.println(list);
    }
}

使用 Fisher-Yates 算法

对于基本类型数组(如 int[]),可以手动实现 Fisher-Yates 算法进行随机打乱。该算法通过交换元素实现高效随机化。

import java.util.Random;

public class ShuffleArray {
    public static void main(String[] args) {
        int[] array = {1, 2, 3, 4, 5};
        shuffleArray(array);
        for (int num : array) {
            System.out.print(num + " ");
        }
    }

    public static void shuffleArray(int[] array) {
        Random random = new Random();
        for (int i = array.length - 1; i > 0; i--) {
            int index = random.nextInt(i + 1);
            int temp = array[index];
            array[index] = array[i];
            array[i] = temp;
        }
    }
}

使用 Java 8 Stream API

通过 Stream 生成随机索引并重新排序数组,适用于需要函数式编程风格的场景。

java数组如何打乱

import java.util.Arrays;
import java.util.Random;

public class ShuffleArray {
    public static void main(String[] args) {
        int[] array = {1, 2, 3, 4, 5};
        int[] shuffled = Arrays.stream(array)
                .boxed()
                .sorted((a, b) -> new Random().nextInt() % 2 == 0 ? -1 : 1)
                .mapToInt(Integer::intValue)
                .toArray();
        System.out.println(Arrays.toString(shuffled));
    }
}

注意事项

  • 性能差异Collections.shuffle 和 Fisher-Yates 算法的时间复杂度为 O(n),而 Stream API 方法效率较低(O(n log n))。
  • 随机性:确保使用高质量的随机数生成器(如 java.util.RandomThreadLocalRandom),避免伪随机问题。
  • 不可变集合:若数组通过 Arrays.asList 转换为列表,需注意返回的列表是固定大小的,不可增删元素。

标签: 数组java
分享给朋友:

相关文章

java如何创建类

java如何创建类

创建类的基本语法 在Java中,类通过class关键字定义,语法如下: [访问修饰符] class 类名 { // 成员变量(属性) // 构造方法 // 成员方法 }…

java如何创建对象

java如何创建对象

创建对象的基本方法 在Java中,创建对象主要通过new关键字调用构造函数完成。基本语法为: ClassName objectName = new ClassName(); 例如创建String对象…

java如何打印数组

java如何打印数组

打印数组的方法 在Java中,打印数组有多种方式,以下是几种常见的方法: 使用Arrays.toString()方法 这种方法适用于一维数组,可以快速将数组转换为字符串形式输出: int[] a…

java如何实现多继承

java如何实现多继承

在Java中,由于语言设计本身不支持多继承(即一个类不能直接继承多个父类),但可以通过以下方式间接实现类似多继承的效果: 使用接口实现多继承 接口允许一个类实现多个接口,从而继承多个抽象行为。接口中…

vue实现嵌套数组

vue实现嵌套数组

Vue 中实现嵌套数组的常见方法 在 Vue 中处理嵌套数组时,通常会结合 v-for 指令和响应式数据管理。以下是几种典型场景的实现方式: 基本嵌套渲染 使用多层 v-for 渲染嵌套数组结构:…

vue怎样实现数组绑定

vue怎样实现数组绑定

Vue 实现数组绑定的方法 Vue 提供了多种方式来实现数组的绑定,以下是常见的几种方法: 使用 v-for 指令绑定数组 通过 v-for 指令可以遍历数组并渲染列表。语法如下: <ul&…