JAVA实现平均分配N人 (分配到的数量和总金额近似相等)

时间:2021-11-01 13:11:55

     

//需要分配的人员集合(list)

//将人员集合顺序随机打乱 因为第一人分配到的案件总金额是最大的

 Collections.shuffle(list);

final int size =list.size();

//将list转换成数组userList 

userList=(String[]) list.toArray((new String[size])); 

//待分配的案件集合(caselist)按照金额由大到小排序		
Collections.sort(caseList,new Comparator<CaseInfo>(){ 
	public int compare(CaseInfo arg0, CaseInfo arg1) { 
	    return arg1.getMoney().compareTo(arg0.getMoney()); 
	} 
}); 

//uid:用于存放人员数组的下标
int uid=0;

//循环需要分配的案件
for(int i=1;i<=caseList.size();i++){
    if((i+(2*userList.length-1))%(2*userList.length)>userList.length-1){
        uid=(2*userList.length-1)-(i+(2*userList.length-1))%(2*userList.length);
	//给案件的人员属性(CollectionPersonnelId)设置应该分配的对应userList[uid]的值
        caseList.get(i-1).setCollectionPersonnelId(userList[uid]);
     }else{
	uid=(i+(userList.length*2-1))%(2*userList.length);
        //给案件的人员属性(CollectionPersonnelId)设置应该分配的对应userList[uid]的值
        caseList.get(i-1).setCollectionPersonnelId(userList[uid]);
     }
}

//分配结束

按照上面的分配方式:

如需要分配给 user1  user2 user3

按照金额排序后案件分配后结果为:(需要分配的数据越多人员所分配到的金额越相近)

金额                       人员ID

233421.56             user1
20301.00               user2
19884.80               user3
19654.00               user3
19588.80               user2
19482.60               user1
19437.00               user1
19234.20               user2
19232.60               user3
19189.00               user3
19116.60               user2
18996.80               user1
18894.20               user1
18834.00               user2
18711.60               user3
18645.20               user3
18624.85               user2
18572.80               user1
18520.40               user1
18448.80               user2
18323.20               user3
18268.00               user3
18232.30               user2
18220.80               user1
18199.80               user1
18192.50               user2
18175.60               user3
18158.20               user3
18132.40               user2