当前位置 : 主页 > 编程语言 > c++ >

生成随机集合工具类

来源:互联网 收集:自由互联 发布时间:2021-06-30
生成随机集合工具类 package com.kting.micro.service.base.commons.util;import java.util.ArrayList;import java.util.Collections;import java.util.HashSet;import java.util.List;import java.util.Set;import org.apache.commons.collections.
生成随机集合工具类
package com.kting.micro.service.base.commons.util;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.RandomUtils;

/**
 * 生成随机集合工具类
 * 
 */
public class RandomDataUtil {
	public final static int TWO = 2;

	/**
	 * 生成随机集合(不重复)
	 * 

* 使用Set的值唯一的特性。 最佳适用场合:集合中数目多,取相对较少对象时。在取对象相对较多时(超过集合的一半时)采用逆向方法, * 在取得对象个数是集合总数的1/2左右时是效率最慢的。 *

* * @param list * @param generateNum * 生成集合中元素的个数 * @param * @return */ public List generateRandomDataNoRepeat(List list, Integer generateNum) { List tList = new ArrayList (); if (CollectionUtils.isNotEmpty(list)) { for (Integer num : generateRandomNoRepeat(list.size(), generateNum)) { tList.add(list.get(num)); } } return tList; } /** * 生成随机集合,随机置换位置、随机截取位置法。 *

* 随机置换法:将集合的每个位置值与随机位置的值调换,并随机截取位置. 最佳适合场合:集合的数量相对较少,获取较多的随机个数集合。 *

* * @param list * @param generateNum * @param * @return */ public List generateRandomPermutation(List list, Integer generateNum) { if (CollectionUtils.isNotEmpty(list)) { checkParams(list.size(), generateNum); List randomAllList = randomPermutation(list, generateNum); int initPosition = interceptPosition(list.size(), generateNum); return randomAllList.subList(initPosition, initPosition + generateNum); } return Collections.emptyList(); } /** * 随机置换算法 * * @param list * @param generateNum * @param * @return */ private List randomPermutation(List list, Integer generateNum) { for (int i = 0; i < list.size(); i++) { Integer random = RandomUtils.nextInt(0,list.size()); T t = list.get(random); list.set(random, list.get(i)); list.set(i, t); } return list; } /** * 随机生成截取位置 * * @param totalCount * @param generateNum * @return */ private Integer interceptPosition(Integer totalCount, Integer generateNum) { int num = RandomUtils.nextInt(0,totalCount); if (num + generateNum > totalCount) { num = num - generateNum; } return num; } /** * 生成不重复的随机数 * * @param totalCount * @param generateNum * @param * @return */ public Set generateRandomNoRepeat(Integer totalCount, Integer generateNum) { if(totalCount getRandomNoRepeat(Integer totalCount, Integer generateNum) { Set set = new HashSet (); while (true) { set.add(RandomUtils.nextInt(0,totalCount)); if (set.size() == generateNum) { return set; } } } /** * 逆向生成set,不重复 * * @param totalCount * @param generateNum * @return */ private Set getReverseRandomNoRepeat(Integer totalCount, Integer generateNum) { Set set = new HashSet (); while (true) { if (set.size() == totalCount - generateNum) { Set setALL = getSetALL(totalCount); setALL.removeAll(set); return setALL; } set.add(RandomUtils.nextInt(0,totalCount)); } } /** * 生成Set * * @param totalCount * @return */ private Set getSetALL(Integer totalCount) { Set set = new HashSet (); for (int i = 0; i < totalCount; i++) { set.add(i); } return set; } }
网友评论