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中对List集合内的元素进行顺序、倒序、随机排序的示例代码

import java.util.Collections; import java.util.LinkedList; import java.util.List;public class Test {...

对List顺序,逆序,随机排列实例代码

package Test;import java.util.Collections;import java.util.LinkedList;import java.util.List;public c...
  • fegor
  • fegor
  • 2007年05月02日 12:48
  • 7336

寻找最快的Java可随机访问排序列表

我是由c#转过来的,在C#中有一个非常好用的排序列表:SortedList 。向它里面添加元素,元素就可以自动排序好。可以通过关键字和索引快速访问。 我在JAVA中也寻找类似的类。找到两个类似的东西...
  • do168
  • do168
  • 2016年07月02日 16:51
  • 823

java collections.shuffle()分析(源码)

collections.shuffle(arraylist),此方法可以将arraylist的顺序随机打乱。 打乱原理是,经典的洗牌思想。 洗牌思想是:一副有序的拍,52张。若想打乱这幅牌,可以将第一...

关于Collections.shuffle()方法的学习

Java.util.Collections类下面有个一静态的shuffle()方法,如下: 1)static void shuffle(List list)  使用默认随机源对列表进行置换,所有置换发...

python random.shuffle(随机打乱列表等) 和 random.random

help(random.shuffle) 可以将列表随机打乱 li=range(20) random.shuffle(li) ##################...

对List<T> 随机排序

对List的一种随机排序方法:(简单、高效) /// /// 对List进行随机排序 /// /// /// ...
  • educast
  • educast
  • 2011年10月12日 12:46
  • 3243

使用Collections类中shuffle随机打乱List内部元素顺序

//适合洗牌程序 public class TestMain { public static void main(String[] args) { ...

C# 泛型List随机排列

有时候得到了一个List,我想把它随机排列一下顺序。而且如果针对不同类型的List都能用,就要用到泛型。 其实思想很简单,就是从原List中每次随机取一项,添加到新的List中,并在原List中删除...

Collections shuffle 随机排序

随机排序除了Random之外Collections  shuffle非常方便 List clouds=new ArrayList6);   Collctions.shuffle...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Collections 随机排序方法Shuffle源码说明
举报原因:
原因补充:

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