情景:数据库中存在权重表,输入参数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;
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 (activityWeightL