Java中随机重新排列数组列表的3种方法

在编程世界中,操作数组是一项基本技能。一个数组可以进行洗牌,包括随机重新排列其元素,这是一个常见的过程。这个过程对于建立随机游戏牌组、运行统计模拟或更随机地显示数据等都是必不可少的。

起初,我们可以应用很多逻辑来洗牌数组;我们可以使用不同类型的集合框架,如 ArrayList、哈希集、链表等。

1. 使用Collections.shuffle :

import java.util.ArrayList;
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 = new ArrayList<>(Arrays.asList(array));

        Collections.shuffle(list);

        // Convert the list back to an array
        Integer[] shuffledArray = list.toArray(new Integer[0]);

       
// Print the shuffled array
        System.out.println(Arrays.toString(shuffledArray));
    }
}

2、使用费舍尔-耶茨(Knuth)洗牌算法:

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

public class ShuffleArray {
    public static void main(String[] args) {
        Integer[] array = {1, 2, 3, 4, 5};

        shuffleArray(array);

        // Print the shuffled array
        System.out.println(Arrays.toString(array));
    }

    private static void shuffleArray(Integer[] array) {
        Random random = new Random();

        for (int i = array.length - 1; i > 0; i--) {
            int index = random.nextInt(i + 1);

           
// Swap array[i] and array[index]
            int temp = array[i];
            array[i] = array[index];
            array[index] = temp;
        }
    }
}

  • 第一种空间复杂度也是O(n)。这是因为 Collections.shuffle() 方法就地修改了原始列表,并且不使用任何额外的数据结构。该代码的时间复杂度为 O(n),其中 n 是数组中元素的数量。
  • 第二种使用的 Fisher-Yates 洗牌算法的时间复杂度为 O(n),其中 n 是数组中的元素数量。

3、Java 8 Streams:

import java.util.Arrays;
import java.util.Random;
import java.util.stream.IntStream;

public class ShuffleArray {
    public static void main(String[] args) {
        int[] array = {1, 2, 3, 4, 5};

        shuffleArray(array);

        // Print the shuffled array
        System.out.println(Arrays.toString(array));
    }

    private static void shuffleArray(int[] array) {
        Random random = new Random();

        IntStream.range(0, array.length)
                .forEach(i -> {
                    int index = random.nextInt(i + 1);

                   
// Swap array[i] and array[index]
                    int temp = array[i];
                    array[i] = array[index];
                    array[index] = temp;
                });
    }
}