import java.util.ArrayList;
import java.util.Comparator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
public class Test {
/**
* @param args
*/
@SuppressWarnings("unchecked")
public static void main(String[] args) {
List<Node> arrNodes = new ArrayList<Node>();
Node n = new Node(1, "测试1");
arrNodes.add(n);
n = new Node(10, "测试2");
arrNodes.add(n);
n = new Node(10, "测试3");
arrNodes.add(n);
n = new Node(80, "测试4");
arrNodes.add(n);
// Collections.sort(arrNodes, new Node());
Map<String, Integer> showMap = null;
int sum = getSum(arrNodes);
int random = 0;
Node kw = null;
for ( int k = 0; k < 100; k++) {
showMap = new LinkedHashMap<String, Integer>();
random = getRandom(sum);
kw = getKW(arrNodes, random);
showMap.put(kw. kw, 1);
// for ( int i = 0; i < 100; i++) {
// random = getRandom(sum);
// kw = getKW(arrNodes, random);
// if (showMap.containsKey(kw.kw)) {
// showMap.put(kw.kw, showMap.get(kw.kw) + 1);
// } else {
// showMap.put(kw.kw, 1);
// }
// // System.out.println(i + " " +random + " " + getKW(arrNodes,
// // random));
// }
System. out.print(k + " ");
System. out.println(showMap);
}
}
/**
* 按照权重值获取的节点
* @Title: getKW
* @Description: 按照权重值获取的节点
* @param nodes 需要获取的节点列表
* @param rd 随机数
* @return: Node
*/
public static Node getKW(List<Node> nodes, int rd) {
Node ret = null;
int curWt = 0;
for (Node n : nodes) {
curWt += n. weight;
if (curWt >= rd) {
ret = n;
break;
}
}
return ret;
}
/**
* 获取权重值的总和
* @Title: getSum
* @Description: 获取权重值的总和
* @param nodes
* @return: int
*/
public static int getSum(List<Node> nodes) {
int sum = 0;
for (Node n : nodes){
sum += n. weight;
}
return sum;
}
public static int getRandom( int seed) {
return ( int) Math. round(Math.random () * seed);
}
}
class Node implements Comparator {
int weight = 0; //权重值(概率值。值越大,被选中的概率就越大)
String kw = "";
public Node() {
}
public Node(int wt, String kw) {
this. weight = wt;
this. kw = kw;
}
public String toString() {
StringBuilder sbBuilder = new StringBuilder();
sbBuilder.append( " weight=").append( weight);
sbBuilder.append( " kw").append( kw);
return sbBuilder.toString();
}
public int compare(Object o1, Object o2) {
Node n1 = (Node) o1;
Node n2 = (Node) o2;
if (n1. weight > n2. weight)
return 1;
else
return 0;
}
}