Java 权重随机简单实现例子代码
public class WeightRandomExample {
public static void main ( String [ ] args) {
List< DefaultWeightEntity> list = new ArrayList < > ( ) ;
list. add ( new DefaultWeightEntity ( "A" , 1 ) ) ;
list. add ( new DefaultWeightEntity ( "B" , 2 ) ) ;
list. add ( new DefaultWeightEntity ( "C" , 3 ) ) ;
DefaultWeightEntity defaultEntity = new DefaultWeightEntity ( "D" , 94 )
list. add ( defaultEntity) ;
WeightRandom< DefaultWeightEntity> weightRandom = new WeightRandom < > ( list, defaultEntity) ;
for ( int i= 0 ; i< 30 ; i++ ) {
DefaultWeightEntity entity = weightRandom. randomEntity ( ) ;
int weight = entity. getWeight ( ) ;
System. out. println ( entity. getName ( ) ) ;
}
}
public interface WeightEntity {
public int getWeight ( ) ;
}
public class WeightRandom < T extends WeightEntity > {
private List< T> content;
private T defaultResult;
public WeightRandom ( List< T> content, T defaultResult) {
this . content = content;
this . defaultResult = defaultResult;
}
public T randomEntity ( ) {
int totalWeight = content. stream ( ) . mapToInt ( WeightEntity: : getWeight) . sum ( ) ;
int randomNum = ThreadLocalRandom. current ( ) . nextInt ( totalWeight) ;
Optional< T> optional = content. stream ( ) . filter ( t - > {
int result = randomNum - t. getWeight ( ) ;
return result < 0 ;
} ) . findFirst ( ) ;
return optional. orElse ( defaultResult) ;
}
}
public class DefaultWeightEntity implements WeightEntity {
private String name;
private int weight;
public DefaultWeightEntity ( String name, int weight) {
this . name = name;
this . weight = weight;
}
@Override
public int getWeight ( ) {
return this . weight;
}
public String getName ( ) {
return name;
}
}
}