Collections 随机排序方法Shuffle源码说明

原创 2015年11月19日 14:45:37
import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;
import java.util.Random;
import java.util.RandomAccess;

import org.junit.Test;
/**
 * Collections随机排序
 *
 */
public class CollectionsShuffle {

	private static Random r;
	private static final int SHUFFLE_THRESHOLD = 5;
	
	public static void shuffle(List<?> list) {
		if (r == null) {
			r = new Random();
		}
		shuffle(list, r);
	}
	
	public static void shuffle(List<?> list, Random rnd) {
		int size = list.size();
		if (size < SHUFFLE_THRESHOLD || list instanceof RandomAccess) {
			for (int i = size; i > 1; i--)
				swap(list, i - 1, rnd.nextInt(i));
		} else {
			Object arr[] = list.toArray();
			
			for (int i = size; i > 1; i--)
				swap(arr, i - 1, rnd.nextInt(i));
			
			ListIterator it = list.listIterator();
			for (int i = 0; i < arr.length; i++) {
				it.next();
				it.set(arr[i]);
			}
		}
	}
	
	public static void swap(List<?> list, int i, int j) {
		final List l = list;
		l.set(i, l.set(j, l.get(i)));
	}
	
	private static void swap(Object[] arr, int i, int j) {
		Object tmp = arr[i];
		arr[i] = arr[j];
		arr[j] = tmp;
	}
	
	
	//初始化List
	public List<Integer> initList(){
		List<Integer> list = new ArrayList<Integer>();
		list.add(1);
		list.add(2);
		list.add(3);
		list.add(4);
		list.add(5);
		list.add(6);
		list.add(7);
		list.add(8);
		list.add(9);
		return list;
	}
	
	//测试Collections随机排序
	@Test
	public void testShuffle(){
		List<Integer> list = initList();
		shuffle(list, new Random());
		for (Integer value : list) {
			System.out.println(value);
		}
	}
	
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

Java随机不重复排序算法

问题描述       给定任意个不重复的数字,对其进行随机排序算法分析       首先想到可以将给定的数字放在一个集合A中,初步定为一个ArrayList,这样,可以用A集合的长度来做为随机数的基数...
  • nomousewch
  • nomousewch
  • 2011年04月01日 14:53
  • 6098

java随机排列数组

有时我们需要随机的排列数组中的元素,随机排列数组,目前常用的有两种方法,第一种就是元素A[i]对应一个优先级P[i],根据优先级作为键值来从新排序数组;第二种方法就是A[i]随机的跟A[i]到A[n]...
  • liangjianyong
  • liangjianyong
  • 2009年12月04日 16:43
  • 5972

java实现快速排序和随机快速排序

[-] 快速排序快速排序的随机化版本性能分析 随机序列10w100w1000w有序序列10w1w1000w 排序算法是算法学习的第一步,想当初我学的第一个算法就是...
  • u012175512
  • u012175512
  • 2016年05月12日 16:31
  • 1437

Java中对List集合内的元素进行顺序、倒序、随机排序的示例代码

import java.util.Collections; import java.util.LinkedList; import java.util.List;public class Test {...
  • u011204221
  • u011204221
  • 2017年05月09日 10:49
  • 1073

JAVA:Collections类的shuffle()方法

JAVA中Collections类的shuffle()方法的作用是将List中的内容随机打乱顺序。 import java.util.ArrayList; import java.util.Coll...
  • caiandyong
  • caiandyong
  • 2015年12月23日 21:09
  • 3221

用Collection.shuffle()随机打乱一个顺序数组

如何打乱一个顺序的数组,其实集合的帮助类Collection就有现成的方法可用,而且效率还蛮高的,总比自定义随机数等等方法要好很多。其实乱序就这么简单,步骤如下: 1. 将一个顺序排列的数组...
  • inter18099
  • inter18099
  • 2012年10月13日 14:16
  • 20708

JAVA中如何用shuffle打乱列表并生成乱序序列

引言 在研究用遗传算法等启发式算法解决旅行商问题(Traveling Salesman Problem,TSP)时,首先要解决的问题时如何生成一个初始解,即一个代表顾客位置的编码序列,如有5个顾客,如...
  • dfb198998
  • dfb198998
  • 2016年05月12日 08:52
  • 7224

Java 集合深入理解(4):List<E> 接口

蓝瘦!香菇! 连着加班,一篇文章写了好几天,心好痛! 在 Java 集合深入理解:Collection 中我们熟悉了 Java 集合框架的基本概念和优点,也了解了根接口之一的 Collection,这...
  • u011240877
  • u011240877
  • 2016年10月13日 01:34
  • 22076

使用JAVA生成十个随机数并进行排序

import java.util.Arrays; public class T1 { public static void main(String[] args) { int max = 10...
  • lixinglong2055
  • lixinglong2055
  • 2014年03月01日 09:47
  • 1106

java实现数组随机重新排列

java实现数组随机重新排列 public class RandomSortTest { private int[]arr = {1,2,3,4,5,6,7,8}; private stati...
  • a1017680279
  • a1017680279
  • 2017年06月01日 13:24
  • 1165
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Collections 随机排序方法Shuffle源码说明
举报原因:
原因补充:

(最多只允许输入30个字)