1. 程式人生 > 其它 >從陣列和List中隨機抽取若干不重複的元素

從陣列和List中隨機抽取若干不重複的元素

一、從陣列中隨機抽取若干不重複元素

/**
 * @function:從陣列中隨機抽取若干不重複元素
 *
 * @param paramArray:被抽取陣列
 * @param count:抽取元素的個數
 * @return:由抽取元素組成的新陣列
 */
public static String[] getRandomArray(String[] paramArray,int count){
        if(paramArray.length<count){
        return paramArray;
        }
        String[] newArray
=new String[count]; Random random= new Random(); int temp=0;//接收產生的隨機數 List<Integer> list=new ArrayList<Integer>(); for(int i=1;i<=count;i++){ temp=random.nextInt(paramArray.length);//將產生的隨機數作為被抽陣列的索引 if(!(list.contains(temp))){ newArray[i
-1]=paramArray[temp]; list.add(temp); } else{ i--; } } return newArray; }
二、從list中隨機抽取若干不重複元素

/**
 * @function:從list中隨機抽取若干不重複元素
 *
 * @param paramList:被抽取list
 * @param count:抽取元素的個數
 * @return:由抽取元素組成的新list
 */
public static List getRandomList(List paramList,int
count){ if(paramList.size()<count){ return paramList; } Random random=new Random(); List<Integer> tempList=new ArrayList<Integer>(); List<Object> newList=new ArrayList<Object>(); int temp=0; for(int i=0;i<count;i++){ temp=random.nextInt(paramList.size());//將產生的隨機數作為被抽list的索引 if(!tempList.contains(temp)){ tempList.add(temp); newList.add(paramList.get(temp)); } else{ i--; } } return newList; }
或者如下方法:
思路1:利用List來把陣列儲存起來,在每取出一個元素後就刪除這個元素。
/**
 * 使用一個List來儲存陣列,每次隨機取出一個移除一個。
 */
public String[] getRandomArray(int n, String[] strArray){
        List<String> list = new ArrayList<String>();
        for(int i=0; i<strArray.length; i++){
        list.add(strArray[i]);
        }
        Random random = new Random();

        // 當取出的元素個數大於陣列的長度時,返回null
        if(n>list.size()){
        return null;
        }

        String[] result = new String[n];
        for(int i=0; i<n; i++){
        // 去一個隨機數,隨機範圍是list的長度
        int index = random.nextInt(list.size());
        result[i] = list.get(index);
        list.remove(index);
        }

        return result;
        }
思路2:在使用一個boolean型陣列儲存對應陣列中元素是否被取出的狀態。
/**
 * 使用一個兩個陣列,一個來儲存元素,一個用來儲存對應元素是否被取走
 */
public String[] getRandomArray(int n, String[] strArray){
        // 當取出的元素個數大於陣列的長度時,返回null
        if(n>strArray.length){
        return null;
        }

        // 定義一個域strArray相同長度的陣列,每個位置儲存對應位置是否被取走
        boolean[] bool = new boolean[strArray.length];
        for(int i=0; i<strArray.length; i++){
        bool[i] = false;
        }

        Random random = new Random();
        String[] result = new String[n];

        for(int i=0; i<n; i++){
        int index;
        // 判斷隨機的位置是否被取走,取走則繼續迴圈
        do{
        index = random.nextInt(n);
        }while(bool[index]);

        // 取出元素,將其對應位置設定為true
        bool[index] = true;
        result[i] = strArray[index];
        }

        return result;
        }