importjava.util.ArrayList;importjava.util.List;importjava.util.Optional;importjava.util.concurrent.ThreadLocalRandom;/***@author:linxu
* @Date:2020-7-24 00:09:54*/
public classWeightRandomTemplate {public static voidmain(String[] args) {
List rewardWraps = new ArrayList<>();
rewardWraps.add(new RewardWrap(12881, "一等奖", 1, 1, 10));
rewardWraps.add(new RewardWrap(12882, "二等奖", 1, 2, 30));
rewardWraps.add(new RewardWrap(12883, "三等奖", 1, 3, 50));//默认奖励,如果抽不到奖,默认抽中安慰奖【参与奖】
RewardWrap rewardWrap = new RewardWrap(12884, "安慰奖", 1, 4, 60);
rewardWraps.add(rewardWrap);
WeightRandom weightRandom = new WeightRandom<>(rewardWraps, rewardWrap);//模拟抽奖二十次【第一种方式调用】
for (int i = 0; i < 20; i++) {
RewardWrap rewardWrapRandom=(RewardWrap) weightRandom.randomWeightWrap();
System.out.println(rewardWrapRandom.toString());
}//模拟抽奖二十次【第二种方式调用】
for (int i = 0; i < 20; i++) {
RewardWrap rewardWrapRandom= (RewardWrap) weightRandom(new IWeightRandom() {
@Overridepublic ListapplyWraps() {returnrewardWraps;
}
@OverridepublicDefaultWeightWrap applyDefaultWrap() {returnrewardWrap;
}
});
System.out.println(rewardWrapRandom.toString());
}
}//测试实现类
public static class RewardWrap extendsDefaultWeightWrap {private int rewardId;//奖励id
private String rewardName;//奖励名称
private int rewardValue;//数量
private int rank;//奖励排名1等奖,2等奖
public RewardWrap(int rewardId, String rewardName, int rewardValue, int rank, intweight) {this.rewardName =rewardName;this.rewardValue =rewardValue;this.rewardId =rewardId;this.rank =rank;this.weight =weight;
}public intgetRewardId() {returnrewardId;
}public void setRewardId(intrewardId) {this.rewardId =rewardId;
}public intgetRank() {returnrank;
}public void setRank(intrank) {this.rank =rank;
}
@OverridepublicString toString() {return "Reward{" +
"rewardId=" + rewardId +
", rewardName='" + rewardName + '\'' +
", rewardValue=" + rewardValue +
", rank=" + rank +
'}';
}
}/*** 方式1【创建对象调用的方式】
*
*@param*/
public static class WeightRandom{private List content;//目标集合数据
private T defaultResult;//默认返回值【参与奖励】
public WeightRandom(Listcontent, T defaultResult) {this.content =content;this.defaultResult =defaultResult;
}publicT randomWeightWrap() {int s =content.stream().mapToInt(DefaultWeightWrap::getWeight).sum();int r =ThreadLocalRandom.current().nextInt(s);
Optional o = content.stream().filter(t -> { int result = r - t.getWeight();return result < 0; }).findFirst();returno.orElse(defaultResult);
}
}/*** 方式2【静态方法,内部实现接口方式的调用】
*
*@paramiWeightRandom
*@param
*@return
*/
public static T weightRandom(IWeightRandomiWeightRandom) {int s =iWeightRandom.applyWraps().stream().mapToInt(DefaultWeightWrap::getWeight).sum();int r =ThreadLocalRandom.current().nextInt(s);
Optional o = iWeightRandom.applyWraps().stream().filter(t -> { int result = r - t.getWeight();return result < 0; }).findFirst();returno.orElse(iWeightRandom.applyDefaultWrap());
}public interface IWeightRandom{
List applyWraps();//目标集合数据
T applyDefaultWrap();//默认返回值【参与奖励】
}//权重包装基类
public static abstract classDefaultWeightWrap {public int weight;//权重
public intgetWeight() {returnweight;
}
@OverridepublicString toString() {return "DefaultWeightWrap{" +
"weight=" + weight +
'}';
}
}
}