Java Collections.shuffle()方法案例详解

Java.util.Collections类下有一个静态的shuffle()方法,如下:

1)static void shuffle(List<?> list)  使用默认随机源对列表进行置换,所有置换发生的可能性都是大致相等的。

2)static void shuffle(List<?> list, Random rand) 使用指定的随机源对指定列表进行置换,所有置换发生的可能性都是大致相等的,假定随机源是公平的。

通俗一点的说,就像洗牌一样,随机打乱原来的顺序。

注意:如果给定一个整型数组,用Arrays.asList()方法将其转化为一个集合类,有两种途径:

1)用List<Integer> list=ArrayList(Arrays.asList(ia)),用shuffle()打乱不会改变底层数组的顺序。

2)用List<Integer> list=Arrays.aslist(ia),然后用shuffle()打乱会改变底层数组的顺序。代码例子如下:

package ahu;
import java.util.*;

public class Modify {
	public static void main(String[] args){
		Random rand=new Random(47);
		Integer[] ia={0,1,2,3,4,5,6,7,8,9};
		List<Integer> list=new ArrayList<Integer>(Arrays.asList(ia));
		System.out.println("Before shufflig: "+list);
		Collections.shuffle(list,rand);
		System.out.println("After shuffling: "+list);
		System.out.println("array: "+Arrays.toString(ia));
		List<Integer> list1=Arrays.asList(ia);
		System.out.println("Before shuffling: "+list1);
		Collections.shuffle(list1,rand);
		System.out.println("After shuffling: "+list1);
		System.out.println("array: "+Arrays.toString(ia));

	}
}

运行结果如下:

Before shufflig: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

After shuffling: [3, 5, 2, 0, 7, 6, 1, 4, 9, 8]

array: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

Before shuffling: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

After shuffling: [8, 0, 5, 2, 6, 1, 4, 9, 3, 7]

array: [8, 0, 5, 2, 6, 1, 4, 9, 3, 7]

在第一种情况中,Arrays.asList()的输出被传递给了ArrayList()的构造器,这将创建一个引用ia的元素的ArrayList,因此打乱这些引用不会修改该数组。 但是,如果直接使用Arrays.asList(ia)的结果, 这种打乱就会修改ia的顺序。意识到Arrays.asList()产生的List对象会使用底层数组作为其物理实现是很重要的。 只要你执行的操作 会修改这个List,并且你不想原来的数组被修改,那么你就应该在另一个容器中创建一个副本。

到此这篇关于Java Collections.shuffle()方法案例详解的文章就介绍到这了,更多相关Java Collections.shuffle()方法内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 如何在C#中使用只读的 Collections

    目录 三大只读类型介绍 使用 IReadOnlyList 替换 List 使用 IEnumberable 接口 集合 表示一组可用于获取和存储的对象,在 C# 中提供了两种类型的集合. 普通集合 泛型集合 前者存在于 System.Collections 命名空间下,属类型不安全的,后者存在于 System.Collections.Generic 命名空间下,属类型安全的. 不可变对象 定义为一旦创建就不可变更的对象, 在 .NET Core 中就存在着这三大 IReadOnlyList,IRe

  • Java Collections类操作集合详解

    Collections 类是 Java 提供的一个操作 Set.List 和 Map 等集合的工具类.Collections 类提供了许多操作集合的静态方法,借助这些静态方法可以实现集合元素的排序.查找替换和复制等操作.下面介绍 Collections 类中操作集合的常用方法. 1) 排序(Sort)     使用sort方法可以根据元素的自然顺序,对指定列表进行排序.列表中的所有元素都必须实现 Comparable 接口.或此列表内的所有元素都必须是使用指定比较器可相互比较的   Collec

  • Java中Collections.emptyList()的注意事项

    偶然发现有小伙伴错误地使用了Collections.emptyList()方法,这里记录一下.她的使用方式是: public void run() { ...... List list = buildList(param); ...... Object newNode = getNode(...); list.add(newNode); ...... } public List buildList(Object param) { if (isInValid(param)) { return Co

  • Java基础详解之集合框架工具Collections

    一.Collections 说明:Collcetions是集合框架中的工具,特点是方法都是静态的. 二.Collections中的常见方法 1,对list进行二分查找:前提该集合一定要有序. int binarySearch(list,key);//要求list集合中的元素都是Comparable的子类. int binarySearch(list,key,Comparator); 2,对list集合进行排序. sort(list); sort(list,comaprator); 3,对集合取最

  • python 中的collections.OrderedDict() 用法

    Python中的字典对象可以以"键:值"的方式存取数据.OrderedDict是它的一个子类,实现了对字典对象中元素的排序. 注意,OrderedDict的 Key 会按照插入的顺序排列,不是Key本身排序: 比如下面比较了两种方式的不同: import collections print 'Regular dictionary:' d={} d['a']='A' d['b']='B' d['c']='C' for k,v in d.items(): print k,v print '

  • Python collections模块的使用技巧

    一般来讲,python的collections是用于存储数据集合(比如列表list, 字典dict, 元组tuple和集合set)的容器.这些容器内置在Python中,可以直接使用.该collections模块提供了额外的,高性能的数据类型,可以增强你的代码,使事情变得更清洁,更容易. 让我们看一看关于集合模块最受欢迎的数据类型以及如何使用它们的教程! Counter Counter()是字典对象的子类.Counter()可接收一个可迭代遍历的对象(例如字符串.列表或元组)作为参数,并返回计数器

  • Python的collections模块真的很好用

    collections是实现了特定目标的容器,以提供Python标准内建容器 dict , list , set , 和 tuple 的替代选择.为了让大家更好的认识,本文详细总结collections的相关知识,一起来学习吧! collections模块:实现了特定目标的容器,以提供Python标准内建容器 dict.list.set.tuple 的替代选择. Counter:字典的子类,提供了可哈希对象的计数功能. defaultdict:字典的子类,提供了一个工厂函数,为字典查询提供了默认

  • Python collections模块的使用方法

    collections模块 这个模块实现了特定目标的容器,以提供Python标准内建容器 dict.list.set.tuple 的替代选择. Counter:字典的子类,提供了可哈希对象的计数功能 defaultdict:字典的子类,提供了一个工厂函数,为字典查询提供了默认值 OrderedDict:字典的子类,保留了他们被添加的顺序 namedtuple:创建命名元组子类的工厂函数 deque:类似列表容器,实现了在两端快速添加(append)和弹出(pop) ChainMap:类似字典的容

  • python collections模块的使用

    collections模块 collections模块:提供一些python八大类型以外的数据类型 python默认八大数据类型: - 整型 - 浮点型 - 字符串 - 字典 - 列表 - 元组 - 集合 - 布尔类型 1.具名元组 具名元组只是一个名字 应用场景: ① 坐标 # 应用:坐标 from collections import namedtuple # 将"坐标"变成"对象"的名字 # 传入可迭代对象必须是有序的 point = namedtuple(&

  • Java Collections.shuffle()方法案例详解

    Java.util.Collections类下有一个静态的shuffle()方法,如下: 1)static void shuffle(List<?> list)  使用默认随机源对列表进行置换,所有置换发生的可能性都是大致相等的. 2)static void shuffle(List<?> list, Random rand) 使用指定的随机源对指定列表进行置换,所有置换发生的可能性都是大致相等的,假定随机源是公平的. 通俗一点的说,就像洗牌一样,随机打乱原来的顺序. 注意:如果给

  • Java BigDecimal中divide方法案例详解

    1.首先说一下用法,BigDecimal中的divide主要就是用来做除法的运算.其中有这么一个方法. public BigDecimal divide(BigDecimal divisor,int scale, int roundingMode) 第一个参数是除数,第二个参数代表保留几位小数,第三个代表的是使用的模式. BigDecimal.ROUND_DOWN:直接省略多余的小数,比如1.28如果保留1位小数,得到的就是1.2 BigDecimal.ROUND_UP:直接进位,比如1.21如

  • Java for循环常见优化方法案例详解

    目录 方法一:最常规的不加思考的写法 方法二:数组长度提取出来 方法三:数组长度提取出来 方法四:采用倒序的写法 方法五:Iterator 遍历 方法六:jdk1.5后的写法 方法七:循环嵌套外小内大原则 方法八:循环嵌套提取不需要循环的逻辑 方法九:异常处理写在循环外面 前言 我们都经常使用一些循环耗时计算的操作,特别是for循环,它是一种重复计算的操作,如果处理不好,耗时就比较大,如果处理书写得当将大大提高效率,下面总结几条for循环的常见优化方式. 首先,我们初始化一个集合 list,如下

  • Java 处理高并发负载类优化方法案例详解

    java处理高并发高负载类网站中数据库的设计方法(java教程,java处理大量数据,java高负载数据) 一:高并发高负载类网站关注点之数据库 没错,首先是数据库,这是大多数应用所面临的首个SPOF.尤其是Web2.0的应用,数据库的响应是首先要解决的. 一般来说MySQL是最常用的,可能最初是一个mysql主机,当数据增加到100万以上,那么,MySQL的效能急剧下降.常用的优化措施是M-S(主-从)方式进行同步复制,将查询和操作和分别在不同的服务器上进行操作.我推荐的是M-M-Slaves

  • Java强制保留两位小数的四种方法案例详解

    方法一:String的format方法(推荐) double f = 111231.5585; System.out.println(String.format("%.2f", f)); 方法二:DecimalFormat的format方法 double f = 111231.5585; DecimalFormat df = new DecimalFormat("#.00"); System.out.println(df.format(f)); 以下内容了解即可,可

  • Java getParameter方法案例详解

    html核心代码 <body> <font size = "5" color ="blue">圆面积计算</font><br> <form action = "home/CCarea" method = "post"> 请输入半径r:<input type="text" name = "radius" value = &q

  • Java之Jackson使用案例详解

    序列化 序列化 (Serialization)是将对象的状态信息转换为可以存储或传输的形式的过程.在序列化期间,对象将其当前状态写入到临时或持久性存储区.以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象. Json是什么? Jason是 JavaScript Object Notation-  JavaScript对象表示法,是一种轻量级数据交换格式.主要用于数据传输,比如说在后端写了一个Java对象,想在其他地方(前端)使用这个对象,就需要转换为Json这种形式进行传输. 1.

  • Java之Buffer属性案例详解

    一.前言 熟悉NIO的人想必一定不会陌生buffer中position,limit,capacity这三个属性吧,之前在学习的时候遇到一个问题:就是当你先往缓冲区写入一部分数据,然后调用flip()方法,再全部读取完数据,然后再调用flip()方法,此时这三个值的变化是怎样的,研究了一下,决定写下来分享一下. 二.正文 1.介绍 position: 它指的是下一次读取或写入的位置. limit: 指定还有多少数据需要写出(在从缓冲区写入通道时),或者还有多少空间可以读入数据(在从通道读入缓冲区时

  • Java Spring拦截器案例详解

    springmvc提供了拦截器,类似于过滤器,他将在我们的请求具体出来之前先做检查,有权决定接下来是否继续,对我们的请求进行加工. 拦截器,可以设计多个. 通过实现handlerunterceptor,这是个接口 定义了非常重要的三个方法: 后置处理 前置处理 完成处理 案例一: 通过拦截器实现方法耗时统计与警告 package com.xy.interceptors; import org.springframework.web.servlet.HandlerInterceptor; impo

随机推荐