`

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

    博客分类:
  • Java
阅读更多
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);
		}
	}
	
}

 

分享到:
评论

相关推荐

    C#数组的随机排序源码

    本篇文章将详细探讨C#中实现数组的随机排序的方法,以及相关的编程技巧。 随机排序不同于常见的升序或降序排序,它是指数组中的元素被随机地重新排列,每个元素都有相等的概率出现在数组的任何位置。这种排序方式在...

    随机点名系统源码

    - 随机点名的核心在于生成一个不重复的随机序列,常用的方法是使用编程语言中的随机数生成函数,如Python的`random.sample()`或Java的`Collections.shuffle()`。这些函数能确保在给定的范围内生成一个无偏的随机...

    Collections源码java-Java-Collection-:对Java的Collection框架源码阅读

    `shuffle(List&lt;?&gt; list)`则随机打乱集合元素的顺序,通常用于游戏或测试场景。 2. **集合转换**:`reverse(List&lt;?&gt; list)`将列表中的元素顺序反转。`copy(List&lt;? super T&gt; dest, List&lt;? extends T&gt; src)`可以将一个...

    斗地主Java游戏源码

    例如,使用`Collections.shuffle()`方法可以随机打乱牌的顺序,而牌型比较可能需要用到条件语句和循环结构。 此外,为了保证游戏的公平性和可玩性,源码中可能包含了错误处理和异常处理机制,例如防止玩家出牌超出...

    斗地主核心算法源码讲解.rar

    洗牌是随机打乱牌的顺序,通常通过`Collections.shuffle()`实现,它使用了Fisher-Yates(Knuth)洗牌算法。发牌则涉及到将洗好的牌平均分配给三个玩家,需要注意的是,发牌过程应确保每个玩家得到的牌是连续且无...

    Collections源码java-[removed]html,css,javascript,ajax源集合

    4. **集合操作方法**:Collections类提供了丰富的静态方法,如`sort()`, `reverse()`, `shuffle()`, `copy()`, `binarySearch()`等,用于排序、反转、随机化、复制和搜索集合元素。 5. **并发集合**:Java提供了...

    java发牌实现程序

    使用`Collections.shuffle`方法对`desk`列表进行随机排序,即模拟洗牌过程。 ### 8. 发牌逻辑 ```java for (int i = 0; i ; i++) { System.out.println(perHand(desk, cardPerHand)); } ``` - 通过循环调用`...

    详解java_ 集合综合案例:斗地主

    Collections类中的shuffle方法用于将指定的列表进行随机排序。它是一个静态方法,可以将ArrayList中的牌顺序进行随机打乱,模拟洗牌的过程。 ### 3. 斗地主牌组的构建 在Java代码中,我们首先定义了两个ArrayList:...

    Java基础学习25.pdf

    - shuffle:随机排列集合。 - reverse:反转集合中元素的顺序。 - sort:排序集合中的元素,排序基于元素的自然顺序或自定义比较器。 - binarySearch:使用二分搜索法查找指定值。 7. **并发集合类**:在多线程...

    java链表

    此外,`Collections`类提供了一些方便的方法来操作链表,如`sort()`进行排序,`shuffle()`进行随机排列。 7. **应用场景** - 队列实现:由于`LinkedList`支持在两端进行插入和删除,所以常用于实现FIFO(先进先出...

    Java实现简单的斗地主游戏.doc

    - 为了模拟真实的洗牌过程,使用了`Collections.shuffle()`方法对存储牌编号的`ArrayList` `pookerNumber`进行随机打乱,确保每一轮游戏开始时,牌的顺序都是不确定的。 3. **发牌**: - 发牌是通过遍历打乱后的...

    5-Card-Poker

    洗牌则需要对数组或集合进行随机排序,可以利用Java的`Collections.shuffle()`方法。比较牌型则涉及到对扑克牌的逻辑判断,例如同花顺、四条、葫芦等,这需要编写一系列的条件判断语句。 在用户交互方面,Java的`...

Global site tag (gtag.js) - Google Analytics