Java Collections.shuffle()方法及示例

Java Collections.shuffle()方法及示例

集合类的shuffle()方法正如该类的名字所示,存在于被称为java.util的实用程序包中,用于洗刷列表中的元素。

在我们的程序中,有 两种方法 可以用来实现,如下所示。

  1. 使用预先定义的随机性源
  2. 使用用户提供的随机性来源

方法1: 使用预定义的随机性源对一个给定的列表进行洗牌。

语法

public static void shuffle(List mylist)
Java

抛出的异常: 如果给定的 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);
    }
}
Java

输出

Original List : 


Shuffled List : 
[quiz, quiz, geeksforgeeks, code, practice, qa]
Java

方法2: 使用用户提供的随机性源对给定的列表进行洗牌。

这里提供了一个额外的参数,上面指定的”rndm”是用来洗牌的随机性来源。

语法

public static void shuffle(List mylist, Random rndm)
Java

参数: 这里它需要两个参数,列在

  • 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);
    }
}
Java

输出

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) : 
Java

但是,在实现这个方法之前,请记住下面列出的某些要点 ,如下图 ,如下图 。

  • 内部工作: 这个方法随机地在一个列表中随机地排列元素。
  • 运行时间: 它以线性时间运行。
  • 对元素的访问。
    • 它向后遍历列表,从最后一个元素到第二个元素,重复地将一个随机选择的元素交换到其 “当前位置”。
    • 此后,从列表中从第一个元素到当前位置的部分随机选择元素,包括在内。

注意: 如果提供的列表没有实现RandomAccess接口,就像LinkedList一样,并且很大,它首先将列表复制到一个数组中,然后对数组的副本进行洗牌,最后将数组复制回列表中。这样可以确保时间保持线性。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程