关于从list或者数组中随机抽取部分不重复元素的问题探究

近期做公司项目遇到一个需要从查询记录中随机抽取指定数目的记录的问题,经过查找资料以及亲自试验,对此类问题进行简单实现。

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;
		}
	}

}
其实想想,这种随机抽取应该是项目的常规需求吧,具体效果看看之后的测试效果吧。我将会继续关注这一问题,看看有没有更好的解决方案。


  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值