1. 工具类
import java.util.List;
import java.util.Random;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* 根据权重获取随机对象的通用类。</p>
* 使用该方法的对象必须实现 WeightI接口.
*/
public class WeightRandom {
private static Random random = new Random();
private static final Logger logger = LoggerFactory.getLogger(WeightRandom.class);
/**
* 根据权重随机对象.
* @param list
* @return
*/
public static <T> T getObject(List<T> list){
if (list == null) {
return null;
}
if (list.size() == 1) {
return list.get(0);
}
T result = null;
Integer weightSum = 0;
for (T t : list) {
WeightI weight = (WeightI)t;
weightSum += weight.getWeight();
if (weight.isSuper()) {
return t;
}
}
if (weightSum <= 0) {
logger.error("Error: weightSum=" + weightSum.toString());
return null;
}
Integer n = random.nextInt(weightSum); // n in [0, weightSum)
Integer m = 0;
for (T t : list) {
WeightI weight = (WeightI)t;
if (m <= n && n < m + weight.getWeight()) {
result = t;
break;
}
m += weight.getWeight();
}
return result;
}
}
2. Entiry
/**
* 获取权重接口。
*
*/
public interface WeightI {
/**
* 获取对象的权重值
* @return
*/
Integer getWeight();
/**
* 是否具有排他的超级权限.</p>
* 如果具有该权限那么一定返回该对象.
* @return
*/
boolean isSuper();
}
3. 调用
List<AdWeight> ads = new ArrayList<AdWeight>();
for (Entry<String, String> entry : adsMap.entrySet()) {
AdWeight adWeight = new AdWeight(Integer.parseInt(entry.getKey()),Integer.parseInt(entry.getValue()));
ads.add(adWeight);
}
//根据权重获取随机对象
AdWeight adWeight = WeightRandom.getObject(ads);