Java Collections.shuffle()方法及示例
集合类的shuffle()方法正如该类的名字所示,存在于被称为java.util的实用程序包中,用于洗刷列表中的元素。
在我们的程序中,有 两种方法 可以用来实现,如下所示。
- 使用预先定义的随机性源
- 使用用户提供的随机性来源
方法1: 使用预定义的随机性源对一个给定的列表进行洗牌。
语法
public static void shuffle(List mylist)
抛出的异常: 如果给定的 list 或其 list-iterator 不支持 set 操作,则抛出 UnsupportedOperationException 。
例子
// Java program to demonstrate
// working of shuffle() method
// of Collections class
// Importing utility classes
import java.util.*;
// Main class
public class GFG {
// Main driver method
public static void main(String[] args)
{
// Creating an empty ArrayList of string type
ArrayList<String> mylist = new ArrayList<String>();
// Adding custom input elements to list object
mylist.add("code");
mylist.add("quiz");
mylist.add("geeksforgeeks");
mylist.add("quiz");
mylist.add("practice");
mylist.add("qa");
// Printing list before shuffling
System.out.println("Original List : \n" + mylist);
// Shuffling the list
Collections.shuffle(mylist);
// Printing list after shuffling
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
异常: 如果指定的列表或其列表迭代器不支持set操作,则出现UnsupportedOperationException。
例子
// Java Program to demonstrate working of shuffle()
// with user provided source of randomness
// Importing required utility classes
import java.util.*;
// Main class
public class GFG {
// Main driver method
public static void main(String[] args)
{
// Creating an empty ArrayList of string type
ArrayList<String> mylist = new ArrayList<String>();
// Adding custom input elements to above created
// object
mylist.add("code");
mylist.add("quiz");
mylist.add("geeksforgeeks");
mylist.add("quiz");
mylist.add("practice");
mylist.add("qa");
// Print and display the elements of List on console
System.out.println("Original List : \n" + mylist);
// Shuffling the given list
// using Random() method
Collections.shuffle(mylist, new Random());
// Print the updated list on console
System.out.println(
"\nShuffled List with Random() : \n" + mylist);
// Shuffling list by using Random(3)
Collections.shuffle(mylist, new Random(3));
// Print the updated list on console
System.out.println(
"\nShuffled List with Random(3) : \n" + mylist);
// Again shuffling list by using Random(3)
Collections.shuffle(mylist, new Random(5));
System.out.println(
"\nShuffled List with Random(5) : \n" + mylist);
}
}
输出
Original List :
Shuffled List with Random() :
[geeksforgeeks, qa, quiz, code, quiz, practice]
Shuffled List with Random(3) :
[practice, code, qa, quiz, geeksforgeeks, quiz]
Shuffled List with Random(5) :
但是,在实现这个方法之前,请记住下面列出的某些要点 ,如下图 ,如下图 。
- 内部工作: 这个方法随机地在一个列表中随机地排列元素。
- 运行时间: 它以线性时间运行。
- 对元素的访问。
- 它向后遍历列表,从最后一个元素到第二个元素,重复地将一个随机选择的元素交换到其 “当前位置”。
- 此后,从列表中从第一个元素到当前位置的部分随机选择元素,包括在内。
注意: 如果提供的列表没有实现RandomAccess接口,就像LinkedList一样,并且很大,它首先将列表复制到一个数组中,然后对数组的副本进行洗牌,最后将数组复制回列表中。这样可以确保时间保持线性。