现有一需求,就是假设有若干任务执行者执行一定数目的任务,并且任务的分配需按一定的权重比来进行。任务的分配是随机的,分配完毕后需要为每条任务打上执行者的标签(即被谁执行。)分配算法不难,但是用java写起来还是蛮巧妙的~ 觉得很有意思,遂记之。

算法设计:

1)总的任务数能被权重和整除,则每个人分配的数量就是:总任务数/权重和*权重

2)总的任务数不能被权重和整除,则先按整除的数按1)的方式分,然后余数再优先分给权重较小的执行者。

//总的任务

List dataList = pm1.getDataList();

int total = dataList.size();

//待分配人员

List autoList = pmAuto.getDataList();

//总权重

int totalWight = 0;

for(int i= 0;i

ExecutorDTO dto = autoList.get(i);

int weight = dto.getWeight();

totalWight += weight;

}

//获得能整除的最大数

Integer maxInt = getMaxInt(totalWight, total);

int rest = total - maxInt;

//要保存的结果集

List resultList = new ArrayList();

for(int i=0;i

int assignNum = maxInt/totalWight*(autoList.get(i).getWeight());

int count = 0;

while(count < assignNum){

if(dataList.size()>0){

Random random = new Random();

//根据对话记录总数产生随机数

int index =random.nextInt((int)dataList.size());

TaskDTO dto = dataList.get(index);

if(null != dto){ dto.setAssignOperator(autoList.get(i).getId());

resultList.add(dto);

count ++;

dataList.remove(index);//已分配的就从待分配的任务数中拿掉

}

}else{

break;

}

}

autoList.get(i).setTask(autoList.get(i).getTask() + count);//更新每个任务执行者的任务数

}

System.out.println("dataList大小:" + dataList.size() + ", 余数为:" + rest);

if(dataList.size() > 0) {

//按权重从小到大分余数~

Collections.sort(autoList, new Comparator() {

@Override

public int compare(ExecutorDTO o1,

ExecutorDTO o2) {

return o1.getWeight() - o2.getWeight();

}

});

List restResultList = this.assignRest(autoList, dataList);

resultList.addAll(restResultList);

}

其中分配余数assignRest的方法为:

private List assignRest(List autoList, List dataList) {

List resultList = new ArrayList();

Map map = new HashMap();

outter:

for(int i=0; i

ExecutorDTO dto = autoList.get(i);

int weight = dto.getWeight();

Random random = new Random();

for(int j=0; j

int index =random.nextInt((int)dataList.size());

TaskDTO chatDTO = dataList.get(index);

if(null != chatDTO){

chatDTO.setAssignOperator(dto.getOperPk());//分配人的id

dto.setTask(dto.getTask() + 1);//更新任务执行者所包含的任务数

resultList.add(chatDTO);

dataList.remove(index);

if(dataList.size() == 0)

break outter;

}

}

}

return resultList;

}

至此,按权重分配的一种java算法就写完了。感觉算法不难,写起来还是有点小困难的,哈哈。

java 权重 分配_一种按权重分配的Java算法相关推荐

  1. Java实现操作系统中四种动态内存分配算法:BF+NF+WF+FF

    1 概述 本文是利用Java实现操作系统中的四种动态内存分配方式 ,分别是: BF NF WF FF 分两部分,第一部分是介绍四种分配方式的概念以及例子,第二部分是代码实现以及讲解. 2 四种分配方式 ...

  2. java native 原理_一种Java+Native应用的系统架构的制作方法

    本发明涉及智能卡技术领域,特别是要求支持Java功能的智能卡领域. 背景技术: Java卡是Sun微系统为智能卡开发平台而制定的一个开放的标准.使用Java卡平台创建的智能卡上存有Java apple ...

  3. bs后端开发语言_哪种编程语言适合后端开发?Java和PHP的区别在哪?

    从技术上看在web开发上,Java和PHP哪个更好呢? 一位从多年PHP开发转Java的技术人员说,应是各有千秋,各有各的好处,这是非常实际的答案. java已经是一门很成熟的语言,曾经看到一篇文章, ...

  4. java 序列化 文件_一种恢复Java序列化文件数据的方法与流程

    本发明涉及信息安全技术领域,特别涉及一种恢复Java序列化文件数据的方法. 背景技术: 在数据解析恢复领域经常会遇到序列化文件的解析.Java序列化是Java 自身提供的一种数据序列化方式,它允许开发 ...

  5. java框架核心技术_你必须掌握的 21 个 Java 核心技术!(干货)

    点击上方"java进阶架构师",选择右上角"置顶公众号" 20大进阶架构专题每日送达 51闲来无事,师长一向不(没)喜(有)欢(钱)凑热闹,倒不如趁着这时候复盘 ...

  6. java future用法_你必须掌握的 21 个 Java 核心技术

    作者:工程师-搁浅来源:https://www.jb51.net/article/122070.htm 写这篇文章的目的是想总结一下自己这么多年来使用java的一些心得体会,主要是和一些java基础知 ...

  7. java 核型技术_你必须掌握的 21 个 Java 核心技术!(转自Java技术栈)

    写这篇文章的目的是想总结一下自己这么多年来使用java的一些心得体会,希望可以给大家一些经验,能让大家更好学习和使用Java. 这次介绍的主要内容是和J2SE相关的部分,另外,会在以后再介绍些J2EE ...

  8. java 清空控制台_利用原生库和JNI(Java原生接口)实现H2数据库漏洞利用

    在H2数据库引擎中获取代码执行权限的技术早已是众所周知,但有个要求就是H2能够动态编译Java代码.而本文将向大家展示以前没有公开过的利用H2的方法,并且无需使用Java编译器,即通过原生库和JNI( ...

  9. java oom分析_作为测试你应该知道的JAVA OOM及定位分析

    上周现网一个内存溢出问题导致应用服务器每隔一小时死一次,遂整理下常见的OMM.发现方法和处理方式,加入Bug预防. 常见的OutOfMemoryError有三种:OutOfMemoryError:Pe ...

  10. java序列化深克隆_如何在内存序列化中使用Java深克隆对象

    java序列化深克隆 在我以前的文章中,我解释了深度克隆和浅层克隆之间的区别 , 以及复制构造函数和防御性复制方法比默认的Java克隆如何更好. 使用复制构造函数和防御性复制方法进行的Java对象克隆 ...

最新文章

  1. as3直接播放flv基本代码
  2. 爷青回!16年前“打球AI”意外走红,程序员留下了自己的ICQ和MSN
  3. Method Tracking
  4. 小程序真机测试「启动参数」解析出错问题
  5. ef mysql 的坑_C# EF 与 MySql 的那些坑
  6. python 树状图代码_Python 无限级分类树状结构生成算法 「实用代码」
  7. 单目相机内参标定的问题
  8. 模拟电子技术基础笔记(2)——半导体基础知识
  9. 史上超全web渗透测试思维导图
  10. c语言 复制到编辑页面 乱码,富文本编辑器的复制word到浏览器发生乱码(vue+wangEditor)...
  11. 实现360浏览器内核模式切换
  12. 三星手机性能测试软件,5部手机性能测试:红米垫底三星倒数第三 第一当之无愧...
  13. appcrash事件怎么解决?三种方法教你
  14. PostgreSQL DBA(81) - Locks(FOR UPDATE SKIP LOCKED)
  15. HarmonyOS实现点亮LED
  16. 远程连接华为云服务器上的MySQL
  17. 关闭tomcat6下的stdout日志
  18. 木舟总结 | 2021年推文笔记分类汇总
  19. acwing-Diango项目 (后半)
  20. 人生苦短,我用Python;平台无限多,最棒大蟒蛇anaconda!

热门文章

  1. 如何修改Tomcat版本
  2. 零起点入门系列:如何把一张纸单变成在线表单?
  3. 南大网院计算机基础第一次作业,南大网院2015计算机基础第一次作业.docx
  4. 计算机office demo,办公软件应用(Office2007)中级 DEMO盘-2013.doc
  5. 计算机课题立项申报书范文,专项课题立项申报书模板.doc
  6. 嘉立创PCB CAM软件
  7. SVN教程代码比较(图文教程)
  8. CSDN 原力 -- beta 测试中
  9. Dev中ChartControl——属性熟悉与简单应用
  10. MATLAB机械动力分析,基于MATLAB的柔性机械臂动力学分析