近期做公司项目遇到一个需要从查询记录中随机抽取指定数目的记录的问题,经过查找资料以及亲自试验,对此类问题进行简单实现。
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;
}
}
}
其实想想,这种随机抽取应该是项目的常规需求吧,具体效果看看之后的测试效果吧。我将会继续关注这一问题,看看有没有更好的解决方案。