版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/cheng_feng_xiao_zhan/article/details/80653982
情景:数据库中存在权重表,输入参数Map,Map包含key为activityId (一次活动的id value为String类型);userLeverl 用户等级(value为Integer类型,区分抽奖是否区分对待)
return:权重表中查询List根据权重随机到的元素Map
注:TODO地方需要读者自由修改,文中未包含建表语句与连接数据库代码,请自由添加
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Random;
/**
* @author cheng_xy
*/
public class LotteryWeightUtils {
private List activityWeightList; // 数据库权重表中根据activityId查询权重List
private List<ContinuousElement> lotteryList = new ArrayList<ContinuousElement>();// 概率连续集合
private int max; // 这里只需要最大值,最小值默认为0
/**
* 定义一个 权重连续集合中 元素
* @author cheng_xy
*/
public class ContinuousElement {
private int min;
private int max;
public ContinuousElement(int min, int max) {
if (min > max) {
System.out.println("区间不合理,min不能大于max!");
throw new IllegalArgumentException("区间不合理,min不能大于max!");
}
this.min = min;
this.max = max;
}
//判断当前集合是否包含特定元素
public boolean isContainKey(int element) {
boolean flag = false;
if (element > min && element <= max) {
flag = true;
}
return flag;
}
}
/**
* 奖品种类为一种时不建议调用该方法
*
* @param reqMap map中包含下面两个key
* activityId 一次活动的id(value为String类型)
* userLeverl 用户等级(value为Integer类型,区分抽奖是否区分对待)
* @return
*/
public Map lotteryWeightRandom(Map reqMap) {
//1.到数据库权重表中根据activityId查询权重
queryActivityWeightList(reqMap);
//2.构造抽奖集合
createLuckDrawList();
//3.随机生成奖品,返回抽奖activityWeightList中Map
return (Map) activityWeightList.get(randomColunmIndex());
}
/**
* 数据库权重表中包含字段:id,活动名,发放的奖品,if_valid(该数据是否有效,1有效 0无效),权重,活动id,奖品数量,可用奖品数量,用户等级,等等
* 根据实际开发需要增减
*
* @param reqMap map中包含下面两个key
* activityId 到数据库权重表中根据activityId查询权重List
* userLeverl 用户等级(区分抽奖是否区分对待,如:表中字段大于0,传0不区分对待,传1只查询出>1的权重,传2只查询出>1的权重...)
* @return
*/
private void queryActivityWeightList(Map reqMap) {
// TODO 读取数据库中数据,下面是测试
// select * from 权重表 where if_valid = '1' and 用户等级 > userleverl 活动id = activityId;
activityWeightList = new ArrayList();
Map map = new HashMap();
map.put("发放的奖品", "直接给1元");
map.put("权重", 1);
Map map1 = new HashMap();
map1.put("发放的奖品", "直接给2元");
map1.put("权重", 4);
activityWeightList.add(map);
activityWeightList.add(map1);
}
/**
* 构造抽奖集合
*
* TODO ((Map) activityWeightList.get(i)).get("权重").toString()
* 需根据实际情况修改字段名称
*/
private void createLuckDrawList() {
int min = 0;
int sortNo;// 权重
if (activityWeightList == null || activityWeightList.size() == 0) {
System.out.println("权重表中查询抽奖集合为空!");
throw new IllegalArgumentException("权重表中查询抽奖集合为空!");
}
ContinuousElement continuousElement = null;
for (int i = 0; i < activityWeightList.size(); i++) {
sortNo = Integer.valueOf(((Map) activityWeightList.get(i)).get("权重").toString());
min = max;
max = max + sortNo;
System.out.println("min=" + min + ",max=" + max);
continuousElement = new ContinuousElement(min, max);
lotteryList.add(continuousElement);
}
}
/**
* 进行抽奖操作,返回:奖品权重lotteryList集合中的下标
* @return
*/
private int randomColunmIndex() {
int randomNum;// 生成0——max+1间的随机数
int index = -1;// 抽奖获得的 数据库权重表中根据activityId查询权重List 的下标
Random r = new Random();
randomNum = r.nextInt(max) + 1;
int size = lotteryList.size();
for (int i = 0; i < size; i++) {
ContinuousElement ce = lotteryList.get(i);
if (ce.isContainKey(randomNum)) {
index = i;
break;
}
}
if (index == -1) {
System.out.println("概率集合设置不合理!");
throw new IllegalArgumentException("概率集合设置不合理!");
}
return index;
}
public double getmax() {
return max;
}
public List<ContinuousElement> getLotteryList() {
return lotteryList;
}
}
希望对你有帮助,祝你有一个好心情,加油!
若有错误、不全、可优化的点,欢迎纠正与补充;转载请注明出处!