Java中的Collections.shuffle()方法及示例
Collections类的shuffle()方法,正如类名所示,位于utility包中,该方法可以将列表中的元素进行随机排序。
我们可以使用以下两种方式在程序中实现:
- 使用预定义的随机源
- 使用用户提供的随机源
方案1: 使用预定义的随机源对给定列表进行随机排序。
语法:
public static void shuffle(List mylist)
抛出的异常: 如果给定的列表或其列表迭代器不支持设置操作,则抛出UnsupportedOperationException异常。
示例:
// Java程序演示
// Collections类的shuffle()方法
// 导入工具类
import java.util.*;
// 主类
public class GFG {
// 主驱动程序
public static void main(String[] args)
{
// 创建一个空的字符串类型ArrayList
ArrayList<String> mylist = new ArrayList<String>();
// 将自定义输入元素添加到列表对象中
mylist.add("code");
mylist.add("quiz");
mylist.add("geeksforgeeks");
mylist.add("quiz");
mylist.add("practice");
mylist.add("qa");
// 打印洗牌前的列表
System.out.println("Original List : \n" + mylist);
// 洗牌列表
Collections.shuffle(mylist);
// 打印洗牌后的列表
System.out.println("\nShuffled List : \n" + mylist);
}
}
输出
Original List :
Shuffled List :
[quiz, quiz, geeksforgeeks, code, practice, qa]
方案2: 使用用户提供的随机源对给定列表进行随机排序。
此处提供了一个额外的参数,即上述的“rndm”是用于随机排序列表的随机源。
语法:
public static void shuffle(List mylist, Random rndm)
参数: 它以两个参数列出,如下:
- mylist
- rndm
异常: 如果指定的列表或其列表迭代器不支持设置操作,则抛出UnsupportedOperationException异常。
示例:
// 演示shuffle()的Java程序,使用用户提供的随机源
// 导入所需的实用程序类
import java.util.*;
// 主类
public class GFG {
// 主驱动程序方法
public static void main(String[] args) {
// 创建一个空的字符串类型的ArrayList
ArrayList<String> mylist = new ArrayList<String>();
// 向上述创建的对象添加自定义输入元素
mylist.add("code");
mylist.add("quiz");
mylist.add("geeksforgeeks");
mylist.add("quiz");
mylist.add("practice");
mylist.add("qa");
// 在控制台上打印并显示List的元素
System.out.println("原始列表:\n" + mylist);
// 使用Random()方法对给定的列表进行洗牌
Collections.shuffle(mylist, new Random());
// 在控制台上打印更新后的列表
System.out.println("\n使用Random()洗牌后的列表:\n" + mylist);
// 使用Random(3)洗牌列表
Collections.shuffle(mylist, new Random(3));
// 在控制台上打印更新后的列表
System.out.println("\n使用Random(3)洗牌后的列表:\n" + mylist);
// 再次使用Random(5)洗牌列表
Collections.shuffle(mylist, new Random(5));
System.out.println("\n使用Random(5)洗牌后的列表:\n" + mylist);
}
}
输出
原始列表:
使用Random()洗牌后的列表:
[geeksforgeeks, qa, quiz, code, quiz, practice]
使用Random(3)洗牌后的列表:
[practice, code, qa, quiz, geeksforgeeks, quiz]
使用Random(5)洗牌后的列表:
但在实现这个方法之前,请记住下面列出的某些重要点 如下所列如下所示 :
- 内部工作原理: 该方法在列表中随机排列元素。
- 运行时间: 它在线性时间内运行。
- 访问元素:
- 它向后遍历列表,从最后一个元素到第二个元素,重复地将随机选择的元素交换到其“当前位置”。
- 然后从列表的第一个元素到当前位置(包括当前位置)随机选择元素。
注意: 如果提供的列表没有实现RandomAccess接口,例如LinkedList,并且很大,它首先将列表复制到数组中,然后洗牌数组副本,最后将数组复制回列表中。这样可以确保时间保持线性。