当前位置:   article > 正文

java实战算法根据个数百分比,排序金额分配案件金额也趋近百分比_分案按照数量均分到机构,再加上按照金额

分案按照数量均分到机构,再加上按照金额

使用场景:

给n个员工分配n个案子。条件是按个数比例分配。分配后的案件金额也趋近于个数的比例,并且趋近公平分配。

设计思路

这里比较复杂的地方就是怎么按个数占比分配,案件金额总数也趋近个数占比。并且趋近公平

例如10个按键,案件金额为1,2,3,4,5,6,7,8,9,10

第一种情况偶数分配:

给两个人分案件,一个分配40%一个分配60%,案件个数就是4:6  = 2:3  怎么让金额也趋近2:3 

设计思路是先将案件按金额大小排序从头尾获取,第一个人获取四个案件,这四个案件分别从头尾获取,例如当A先获取四个案件是,A拿到的案件分别是1,10,2,9。B获取到的就是3,8,4,7,5,6,金额的比例是 22:33 趋近 2:3的案件占比。

第二种情况奇数数分配:

给两个人分案件,一个分配30%一个分配70%,案件个数就是3:7怎么让金额也趋近3:7=0.42设计思路是还是先将案件按金额大小排序从头尾获取,第一个人获取四个案件,这四个案件分别从头尾获取,例如当                                                                A先获取一个中间的案件然后剩下的按偶数的从头尾取案件,同理第二个人也一样A拿到的案件分别是5,1,10  B获取到的就是6,2,9,3,8,4,7 金额的比例是 16:39=0.41趋近于0.42的案件占比。

当总件数跟百分比的乘机为有小数点的时候,向下取整,比如1.4  取 1。最后一个人直接取剩下所有。

偶数分配图示

奇数分配图示


Java代码:

  1. //*********************************************催收公司分案相关**************************//
  2. @Override
  3. public List<User> updateAutoCaseSplit(CaseHead head,CaseParamsExtend exParams,List<User> users,String tableName) {
  4. if (head == null){
  5. return users;
  6. }
  7. if (users == null || users.size() == 0){
  8. return users;
  9. }
  10. //获取案件
  11. List<CaseHead> heads=caseHeadMapper.getCaseHeadAll(head,exParams,tableName);
  12. if (heads == null || heads.size() == 0){
  13. return users;
  14. }
  15. // 进行分案处理 1.案件金额排序
  16. sortCases(heads);
  17. Integer casecount=heads.size();//案件个数
  18. //将用户排序打乱
  19. Collections.shuffle(users);
  20. List<CaseHead> caselist=new ArrayList<CaseHead>();//剩余案件
  21. caselist=heads;
  22. //循环遍历员工
  23. for (int i = 0; i <users.size() ; i++) {
  24. //计算用户分得几个案子 案件数*百分比
  25. if (i != users.size()-1){
  26. double userCaseCount=casecount*users.get(i).getSplitRate()/100;
  27. Integer count=(int)Math.floor(userCaseCount);
  28. //根据分的案件个数从头尾取值 如果有奇数就奇数在中间取一个变为偶数在头尾取值
  29. if (count%2==0){//偶数
  30. Integer total=count/2; //头尾各取total个
  31. for (int j = 0; j < total; j++) {
  32. int end=caselist.size()-1;
  33. users.get(i).addCaseHead(caselist.get(0));//头
  34. users.get(i).addCaseHead(caselist.get(end));//尾
  35. caselist.remove(end);
  36. caselist.remove(0);
  37. }
  38. }else{//奇数
  39. if (count == 1){//如果只有一个案子那么在中间取一个就退出
  40. int middle=(int)Math.floor(caselist.size()/2);
  41. users.get(i).addCaseHead(caselist.get(middle));//中
  42. caselist.remove(middle);
  43. }else{
  44. //第一个取中间
  45. int middle=(int)Math.floor(caselist.size()/2);
  46. users.get(i).addCaseHead(caselist.get(middle));//中
  47. caselist.remove(middle);
  48. //剩下的跟偶数一致
  49. int total=(count-1)/2;
  50. for (int a = 0; a < total; a++) {
  51. int end=caselist.size()-1;
  52. users.get(i).addCaseHead(caselist.get(0));//头
  53. users.get(i).addCaseHead(caselist.get(end));//尾
  54. caselist.remove(end);
  55. caselist.remove(0);
  56. }
  57. }
  58. }
  59. }else{//最后一个不用计算案件数。剩余案件全是最后一个的这是为了以上几个计算有小数点取整误差
  60. for (CaseHead caseHead : caselist) {
  61. users.get(i).addCaseHead(caseHead);
  62. }
  63. }
  64. }
  65. return users;
  66. }
  67. /**
  68. * 执行分案
  69. * */
  70. @Override
  71. public List<User> updateCaseSplit(List<User> users, String tableName) throws Exception {
  72. for (int i = 0; i <users.size() ; i++) {
  73. }
  74. return null;
  75. }
  76. //案件按照金额排序
  77. private void sortCases(List<CaseHead> caseHeads) {
  78. Collections.sort(caseHeads, new Comparator<CaseHead>() {
  79. @Override
  80. public int compare(CaseHead o1, CaseHead o2) {
  81. return (int) (o2.getMoney() - o1.getMoney()) * 1000;
  82. }
  83. });
  84. }
  85. //*********************************************催收公司分案相关结束************************//


  1. //==================分案相关操作
  2. @Transient
  3. private double splitRate;//分案占比;
  4. @Transient
  5. private double splitTotal;//分案总金额
  6. @Transient
  7. private int splitCount;//分案总件数
  8. @Transient
  9. private List<User> userList;//分案参数
  10. @Transient
  11. private List<CaseHead> caseList;//案件list
  12. public List<CaseHead> getCaseList() {
  13. return caseList;
  14. }
  15. public void setCaseList(List<CaseHead> caseList) {
  16. this.caseList = caseList;
  17. }
  18. public List<User> getUserList() {
  19. return userList;
  20. }
  21. public void setUserList(List<User> userList) {
  22. this.userList = userList;
  23. }
  24. public void addCaseHead(CaseHead caseHead){
  25. if(caseList==null)
  26. caseList=new ArrayList<>();
  27. caseList.add(caseHead);
  28. //总额 件数
  29. splitCount++;
  30. splitTotal+=caseHead.getMoney();
  31. }


将分完的结果通过对象返回给前台页面


本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/289215?site
推荐阅读
相关标签
  

闽ICP备14008679号