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);//清除分过的元素 } } //*********************************************催收公司分案相关结束***************************************//
相关文章推荐
- java实战算法根据个数百分比,排序金额分配案件金额也趋近百分比
- 算法实战java实现快速排序
- 算法实战:根据Key或Value对Map进行排序及其应用
- 算法实战:根据Key或Value对Map进行排序及其应用
- java算法之 排序(插入、交换、选择、归并、分配排序)
- 算法方法JAVA中运用数组的四种排序方法
- 基础算法(三)---选择排序(Java)
- JAVA代码—算法基础:计算已排序的数组中不重复的元素个数
- java中的排序算法——简单选择排序,树形选择排序与堆排序(一)
- java使用Comparator根据list对象的属性进行排序
- [jvm解析系列][四]Java的垃圾回收(二)垃圾收集算法,内存分配和回收策略
- 智渔课堂官方免费教程二十八:Java排序算法之选择排序和冒泡排序
- Java SE TreeSet(实现Comparable接口和Comparator匿名类)根据属性排序示例
- Java实现排序算法之 - 插入排序
- java collection.sort()根据时间排序list
- JavaScript ,Python,java,Go系列算法之选择排序
- 【LeetCode-面试算法经典-Java实现】【081-Search in Rotated Sorted Array II(搜索旋转的排序数组)】
- Java---算法---插入排序
- 四.c++中的算法--排序及相关操作---根据某个元素排序
- 内存动态分配的首先适应、最优适应、最坏适应算法的窗口演示(java版)