在编程世界中,操作数组是一项基本技能。一个数组可以进行洗牌,包括随机重新排列其元素,这是一个常见的过程。这个过程对于建立随机游戏牌组、运行统计模拟或更随机地显示数据等都是必不可少的。
起初,我们可以应用很多逻辑来洗牌数组;我们可以使用不同类型的集合框架,如 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; }); } }
|