您的位置:首页 > 编程语言 > Java开发

java实战算法根据个数百分比,排序金额分配案件金额也趋近百分比(二)

2018-02-10 10:52 731 查看
//案件按照金额排序
private void sortCases(List<CaseHead> caseHeads) {
Collections.sort(caseHeads, new Comparator<CaseHead>() {
@Override
public int compare(CaseHead o1, CaseHead o2) {
return (int) (o2.getMoney() - o1.getMoney()) * 1000;
}
});
}

//案件按照用户金额排序
private void sortUserMoney(List<User> Users) {
Collections.sort(Users, new Comparator<User>() {
@Override
public int compare(User o1, User o2) {
return (int) (o2.getSplitTotal() - o1.getSplitTotal()) * 1000;
}
});
}

//案件按照用户百分比排序
private void sortUserRate(List<User> Users) {
Collections.sort(Users, new Comparator<User>() {
@Override
public int compare(User o1, User o2) {
return (int) (o2.getSplitRate() - o1.getSplitRate()) * 1000;
}
});
}

//*********************************************新版催收公司分案相关2018-02-05************************************************//
@Override
public List<User> updateAutoCaseSplit(CaseHead head,CaseParamsExtend exParams,List<User> users,String tableName) {
if (head == null){
return users;
}
if (users == null || users.size() == 0){
return users;
}
//获取案件
List<CaseHead> heads=caseHeadMapper.getCaseHeadAll(head,exParams,tableName);
if (heads == null || heads.size() == 0){
return users;
}
// 进行分案处理 1.案件金额排序
sortCases(heads);
Integer casecount=heads.size();//案件个数
//将用户排序打乱
Collections.shuffle(users);

List<CaseHead> caselist=new ArrayList<CaseHead>();//剩余案件
caselist=heads;
Integer count=1;//判断是第几次取值
Integer lastcount=casecount;
for (User  userCase : users) {
double userCaseCount=casecount*userCase.getSplitRate()/100;
Integer usercount=(int)Math.floor(userCaseCount);
lastcount = lastcount-usercount;
}
while(true){
int size = users.size();//有待分案件
if(caselist.size()>0 && caselist.size()>lastcount){//有待收案件用户
//获取每个人得多少值,计算之后剩余的案件随机分配
if(count%2 != 0){//当为奇数时从头取。为偶数时从尾取
//按案件金额排序用户 小的先取
sortUserMoney(users);
//log.debug("催收员排序:"+users.toString());
for (int i = users.size()-1; i >= 0 ; i--) {
gettopcase(caselist,users.get(i),casecount);//从头取案件
log.debug("催收员:"+users.get(i).getName()+"分后总金额"+users.get(i).getSplitTotal());
}
count=count+1;
}else{//尾 按案件金额排序用户 大的先取
sortUserMoney(users);
//log.debug("催收员排序:"+users.toString());
for (User  userCase : users) {
getendcase(caselist, userCase,casecount);//从尾取案件
log.debug("催收员:"+userCase.getName()+"分后总金额"+userCase.getSplitTotal());
}
count=count+1;
}
}else if (caselist.size() >0 && caselist.size() <= lastcount ){//剩余几个分不出去了按百分比
4000
从大到小依次分一波
sortUserRate(users);
//log.debug("催收员排序:"+users.toString());
for (User  userCase : users) {
getcase(caselist, userCase);
log.debug("催收员:"+userCase.getName()+"分后总金额"+userCase.getSplitTotal());
}
}else{
break;
}
}
return  users;
}

private static boolean chackUserTotalNum(List<User> users) {
boolean flag = true;
double samenum = users.get(0).getSplitTotal();
for (User user : users) {
if(user.getSplitTotal() != samenum){
flag = false;
}
}
return flag;
}

private  void gettopcase(List<CaseHead> cases, User userCase,Integer casecount) {
double userCaseCount=casecount*userCase.getSplitRate()/100;
Integer count=(int)Math.floor(userCaseCount);
if (count > 0 && userCase.getSplitCount() != count && cases.size() > 0) {//此用户被分到的案子大于一个并且不大于应分配的数时
CaseHead addcase = cases.get(0);//取第一个案件
userCase.addCaseHead(addcase);//中
log.debug("分配案件金额"+addcase.getMoney());
cases.remove(0);//清除分过的元素
}
}

private  void getendcase(List<CaseHead> cases, User userCase,Integer casecount) {
double userCaseCount=casecount*userCase.getSplitRate()/100;
Integer count=(int)Math.floor(userCaseCount);
if (count > 0 && userCase.getSplitCount() != count && cases.size() > 0) {//此用户被分到的案子大于一个并且不大于应分配的数时
CaseHead addcase = cases.get(cases.size() - 1);//第最后一个案件
userCase.addCaseHead(addcase);//中
log.debug("分配案件金额"+addcase.getMoney());
cases.remove(cases.size() - 1);//清除分过的元素
}
}

private  void getcase(List<CaseHead> cases, User userCase) {
if (cases.size() > 0) {//此用户被分到的案子大于一个并且不大于应分配的数时
CaseHead addcase = cases.get(0);//取第一个案件
userCase.addCaseHead(addcase);//中
log.debug("分配案件金额"+addcase.getMoney());
cases.remove(0);//清除分过的元素

}
}
//*********************************************催收公司分案相关结束***************************************//
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: