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

     

//需要分配的人员集合(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
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值