需求:根據目標的權重,獲取目標數據;本例:根據用戶Id所佔比重,按權重隨機獲取;能夠根據實際需求,修改K的類型,獲取所需;
package sl; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; /** * 需求 => 根據目標的權重,獲取目標數據; * 本例 => 根據用戶Id所佔比重,按權重隨機獲取;能夠根據實際需求,修改K的類型; * @param <K> * @author panguijia */ public class AssignRule<K> { /** * 隨機規則 */ public K getRandomUserId( Map<K,Integer> rawMap){ Map<K, List<Integer>> idMapper=new HashMap<>(); int count=0; for(K k:rawMap.keySet()){ List<Integer> numList=new ArrayList<>(); for(int i=0;i<rawMap.get(k);i++){ count++; numList.add(count); } idMapper.put(k,numList); } int max=count,min=1; int rand = (int) (Math.random()*(max)+min); for(K k:idMapper.keySet()){ for(int v:idMapper.get(k)){ if(v==rand){ return k; } } } return null; } /** * 驗證分配規則有效性 * @param args */ public static void main(String[] args) { /** * key target * val ratio */ Map<Integer,Integer> rawMap=new HashMap<>(); rawMap.put(1,1); rawMap.put(2,2); rawMap.put(3,3); rawMap.put(4,4); Map<Integer,Integer> map=new HashMap<>(); map.put(1,0); map.put(2,0); map.put(3,0); map.put(4,0); //實例化,目標對象類型 AssignRule<Integer> assignRule=new AssignRule<>(); for(int i=0;i<10000000;i++){ for(int k:map.keySet()){ if(k==assignRule.getRandomUserId(rawMap)){ int v=map.get(k); map.put(k,v+1); } } } for(int k:map.keySet()){ System.out.println(k+" = "+map.get(k)); } } }
驗證結果java
1 = 1001348
2 = 1998783
3 = 3000873
4 = 3997947
Process finished with exit code 0