近期做公司項目遇到一個需要從查詢記錄中隨機抽取指定數目的記錄的問題,經過查找資料以及親自試驗,對此類問題進行簡單實現。
1.問題需求:需要從結果集(一般是list)中隨機抽取若干條不重複的記錄,這裏的不重複是針對list而言的,也就是說隨機抽取list中不同index的元素(抽取出的元素的index各不相同),而不是針對元素本身的,這一點要注意。其實想一想,其實是否可以通過sql來實現這個需求不得而知,不過那不是本例所探討的,本例探討的是從已查詢的結果集中隨機抽取若干條不重複的記錄,使用java進行實現。
2.解決方案:肯定會用到java中的隨機數,java中的隨機數有2種,Math.random()和Random類,二者的實際效果差不多,本例使用Math.random()來實現。基本思路是取得list的指定數目的不重複的index,並取得list中這些index的值組成新的list即可。爲了確保index不重複,想到了使用map,利用map.containsKey()方法來判斷下標是否存在。爲了得到指定的數目使用循環實現。
3.本例的java代碼實現TestRandom
package com.baosight.util;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* <p>Title: </p>
* <p>Description:TestRandom </p>
* <p>Company: </p>
* @author yuan
* @date 2016-4-11 下午8:44:38*/
public class TestRandom {
/**
* @Title: main
* @Description: TODO
* @param args
* @return void
* @throws
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
//從list中隨機抽取n個不同的元素
List list = new ArrayList();
List listNew = new ArrayList();
list.add(1);
list.add(2);
list.add(3);
list.add(4);
list.add(5);
listNew = createRandomList(list,3);
//從數組中隨機抽取元素
int[] arr = {1,2,3,4,5};
int[] arrNew;
arrNew = createRandomArray(arr,3);
}
/**從數組中隨機抽取元素
* @return
* @Title: createRandomArray
* @Description: TODO
* @param arr
* @param i
* @return void
* @throws
*/
private static int[] createRandomArray(int[] arr, int n) {
// TODO Auto-generated method stub
Map map = new HashMap();
int[] arrNew = new int[n];
if(arr.length<=n){
return arr;
}else{
int count = 0;//新數組下標計數
while(map.size()<n){
int random = (int) (Math.random() * arr.length);
if (!map.containsKey(random)) {
map.put(random, "");
System.out.println(random+"==========="+arr[random]);
arrNew[count++] = arr[random];
}
}
return arrNew;
}
}
/**從list中隨機抽取元素
* @return
* @Title: createRandomList
* @Description: TODO
* @param list
* @param i
* @return void
* @throws
*/
private static List createRandomList(List list, int n) {
// TODO Auto-generated method stub
Map map = new HashMap();
List listNew = new ArrayList();
if(list.size()<=n){
return list;
}else{
while(map.size()<n){
int random = (int) (Math.random() * list.size());
if (!map.containsKey(random)) {
map.put(random, "");
System.out.println(random+"==========="+list.get(random));
listNew.add(list.get(random));
}
}
return listNew;
}
}
}
其實想想,這種隨機抽取應該是項目的常規需求吧,具體效果看看之後的測試效果吧。我將會繼續關注這一問題,看看有沒有更好的解決方案。