摘要:的源碼如下一首先是判斷要打亂的的屬性的和是否實(shí)現(xiàn)接口如果的小于或者實(shí)現(xiàn)了接口,則直接交換內(nèi)元素的位置。以上內(nèi)容如有不正確的地方,歡迎支持。
jdk的源碼如下
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(); // Shuffle array for (int i=size; i>1; i--) swap(arr, i-1, rnd.nextInt(i)); // Dump array back into list // instead of using a raw type here, it"s possible to capture // the wildcard but it will require a call to a supplementary // private method ListIterator it = list.listIterator(); for (int i=0; i一、首先是判斷要打亂的list的屬性:list的size和是否實(shí)現(xiàn)RandomAccess接口
如果list的size小于SHUFFLE_THRESHOLD(5) 或者 list實(shí)現(xiàn)了RandomAccess接口,則直接交換list內(nèi)元素的位置。具體的交換策略如下:
令list的size為n, 從n-1位開始,將該位的元素與其前面某一位(隨機(jī)得到)元素交換,直到第1位結(jié)束。使用的函數(shù):
swap(List> list, int i, int j)
public static void swap(List> list, int i, int j) { // instead of using a raw type here, it"s possible to capture // the wildcard but it will require a call to a supplementary // private method final List l = list; l.set(i, l.set(j, l.get(i))); //將j位置的值和i位置的值進(jìn)行交換 }E set(int index, E element)接口
/** * Replaces the element at the specified position in this list with the * specified element (optional operation). * * @param index index of the element to replace * @param element element to be stored at the specified position */ E set(int index, E element)E set(int index, E element)某一實(shí)現(xiàn)
public E set(int index, E element) { try { ListIteratore = listIterator(index); E oldVal = e.next(); e.set(element); return oldVal; //將index的值設(shè)置為element,并返回原來的值 } catch (NoSuchElementException exc) { throw new IndexOutOfBoundsException("Index: "+index); } } 二、如果list沒有實(shí)現(xiàn)RandomAccess接口且長(zhǎng)度大于SHUFFLE_THRESHOLD(5)
這時(shí)候首先要做的是將list轉(zhuǎn)化成數(shù)組,這個(gè)和RandomAccess有關(guān)
/** * Marker interface used by List implementations to indicate that * they support fast (generally constant time) random access. The primary * purpose of this interface is to allow generic algorithms to alter their * behavior to provide good performance when applied to either random or * sequential access lists. * *The best algorithms for manipulating random access lists (such as * ArrayList) can produce quadratic behavior when applied to * sequential access lists (such as LinkedList). Generic list * algorithms are encouraged to check whether the given list is an * instanceof this interface before applying an algorithm that would * provide poor performance if it were applied to a sequential access list, * and to alter their behavior if necessary to guarantee acceptable * performance. * ...... public interface RandomAccess { }
RandomAccess用于標(biāo)識(shí)ist的實(shí)現(xiàn)類是否支持快速地隨機(jī)訪問(一般是O(1)的時(shí)間復(fù)雜度),例如ArraryList實(shí)現(xiàn)了RandomAccess接口,隨機(jī)訪問一個(gè)元素(get(i))所花費(fèi)的時(shí)間復(fù)雜度是O(1),而LinkedList卻沒有實(shí)現(xiàn)這個(gè)接口,所以隨機(jī)一個(gè)元素的時(shí)間復(fù)雜度是O(n)(最壞情況)。所以在遍歷一個(gè)list時(shí),可以先判斷它是否實(shí)現(xiàn)了RandomAccess接口,根據(jù)數(shù)據(jù)結(jié)構(gòu)的不同先進(jìn)行相應(yīng)的處理,避免出現(xiàn)O(n2)的時(shí)間復(fù)雜度。
如在shuffle()的else代碼段中,就先將沒有實(shí)現(xiàn)RandomAccess接口的list轉(zhuǎn)換成數(shù)組,然后在執(zhí)行交換策略,這樣避免O(n2)的時(shí)間復(fù)雜度。以上內(nèi)容如有不正確的地方,歡迎支持。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/68832.html
摘要:如何對(duì)兩個(gè)列表進(jìn)行亂序處理,同時(shí)保持它們的一一對(duì)應(yīng)的關(guān)系已知我們有兩個(gè)列表其中和中的元素是一一對(duì)應(yīng)的。現(xiàn)在我們希望對(duì)兩個(gè)列表進(jìn)行隨機(jī)排序,要求排序后它們依舊是一一對(duì)應(yīng)的。 如何對(duì)兩個(gè)列表進(jìn)行亂序處理,同時(shí)保持它們的一一對(duì)應(yīng)的關(guān)系? 已知我們有兩個(gè)列表 public class RandomizeTwoList { public static String [] file = {...
List接口 List是一個(gè)有序的Collection(有時(shí)稱為序列),列表可能包含重復(fù)元素,除了從Collection繼承的操作之外,List接口還包括以下操作: 位置訪問 — 根據(jù)列表中的數(shù)字位置操縱元素,這包括get、set、add、addAll和remove等方法。 搜索 — 搜索列表中的指定對(duì)象并返回其數(shù)字位置,搜索方法包括indexOf和lastIndexOf。 迭代 — 擴(kuò)展Ite...
摘要:?jiǎn)尉€程集合本部分將重點(diǎn)介紹非線程安全集合。非線程安全集合框架的最新成員是自起推出的。這是標(biāo)準(zhǔn)的單線程陣營(yíng)中唯一的有序集合。該功能能有效防止運(yùn)行時(shí)造型。檢查個(gè)集合之間不存在共同的元素。基于自然排序或找出集合中的最大或最小元素。 【編者按】本文作者為擁有十年金融軟件開發(fā)經(jīng)驗(yàn)的 Mikhail Vorontsov,文章主要概覽了所有標(biāo)準(zhǔn) Java 集合類型。文章系國(guó)內(nèi) ITOM 管理平臺(tái) O...
本文主要是詳細(xì)介紹了pyecharts制作時(shí)長(zhǎng)滾動(dòng)圖片柱狀圖+餅狀圖+玫瑰圖+折線統(tǒng)計(jì)圖,文章內(nèi)容把握重點(diǎn)把握重點(diǎn)詳盡的基本介紹,具有很強(qiáng)的實(shí)用價(jià)值,感興趣的朋友可以了解一下。 1、pyecharts繪制時(shí)間輪播柱形圖 fromrandomimportrandint frompyechartsimportoptionsasopts frompyecharts.chartsimpor...
摘要:中的集合稱為單列集合,中的集合稱為雙列集合。洗牌通過數(shù)字完成洗牌發(fā)牌發(fā)牌將每個(gè)人以及底牌設(shè)計(jì)為將最后張牌直接存放于底牌,剩余牌通過對(duì)取模依次發(fā)牌。存放的過程中要求數(shù)字大小與斗地主規(guī)則的大小對(duì)應(yīng)。 01Map集合概述 A:Map集合概述: 我們通過查看Map接口描述,發(fā)現(xiàn)Map接口下的集合與Collection接口下的集合,它們存儲(chǔ)數(shù)據(jù)的形式不同 ? a:Collection中的集...
閱讀 3885·2021-11-17 09:33
閱讀 1196·2021-10-09 09:44
閱讀 400·2019-08-30 13:59
閱讀 3478·2019-08-30 11:26
閱讀 2177·2019-08-29 16:56
閱讀 2849·2019-08-29 14:22
閱讀 3151·2019-08-29 12:11
閱讀 1269·2019-08-29 10:58