java 权重 分配_一种按权重分配的Java算法
现有一需求,就是假设有若干任务执行者执行一定数目的任务,并且任务的分配需按一定的权重比来进行。任务的分配是随机的,分配完毕后需要为每条任务打上执行者的标签(即被谁执行。)分配算法不难,但是用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算法相关推荐
- Java实现操作系统中四种动态内存分配算法:BF+NF+WF+FF
1 概述 本文是利用Java实现操作系统中的四种动态内存分配方式 ,分别是: BF NF WF FF 分两部分,第一部分是介绍四种分配方式的概念以及例子,第二部分是代码实现以及讲解. 2 四种分配方式 ...
- java native 原理_一种Java+Native应用的系统架构的制作方法
本发明涉及智能卡技术领域,特别是要求支持Java功能的智能卡领域. 背景技术: Java卡是Sun微系统为智能卡开发平台而制定的一个开放的标准.使用Java卡平台创建的智能卡上存有Java apple ...
- bs后端开发语言_哪种编程语言适合后端开发?Java和PHP的区别在哪?
从技术上看在web开发上,Java和PHP哪个更好呢? 一位从多年PHP开发转Java的技术人员说,应是各有千秋,各有各的好处,这是非常实际的答案. java已经是一门很成熟的语言,曾经看到一篇文章, ...
- java 序列化 文件_一种恢复Java序列化文件数据的方法与流程
本发明涉及信息安全技术领域,特别涉及一种恢复Java序列化文件数据的方法. 背景技术: 在数据解析恢复领域经常会遇到序列化文件的解析.Java序列化是Java 自身提供的一种数据序列化方式,它允许开发 ...
- java框架核心技术_你必须掌握的 21 个 Java 核心技术!(干货)
点击上方"java进阶架构师",选择右上角"置顶公众号" 20大进阶架构专题每日送达 51闲来无事,师长一向不(没)喜(有)欢(钱)凑热闹,倒不如趁着这时候复盘 ...
- java future用法_你必须掌握的 21 个 Java 核心技术
作者:工程师-搁浅来源:https://www.jb51.net/article/122070.htm 写这篇文章的目的是想总结一下自己这么多年来使用java的一些心得体会,主要是和一些java基础知 ...
- java 核型技术_你必须掌握的 21 个 Java 核心技术!(转自Java技术栈)
写这篇文章的目的是想总结一下自己这么多年来使用java的一些心得体会,希望可以给大家一些经验,能让大家更好学习和使用Java. 这次介绍的主要内容是和J2SE相关的部分,另外,会在以后再介绍些J2EE ...
- java 清空控制台_利用原生库和JNI(Java原生接口)实现H2数据库漏洞利用
在H2数据库引擎中获取代码执行权限的技术早已是众所周知,但有个要求就是H2能够动态编译Java代码.而本文将向大家展示以前没有公开过的利用H2的方法,并且无需使用Java编译器,即通过原生库和JNI( ...
- java oom分析_作为测试你应该知道的JAVA OOM及定位分析
上周现网一个内存溢出问题导致应用服务器每隔一小时死一次,遂整理下常见的OMM.发现方法和处理方式,加入Bug预防. 常见的OutOfMemoryError有三种:OutOfMemoryError:Pe ...
- java序列化深克隆_如何在内存序列化中使用Java深克隆对象
java序列化深克隆 在我以前的文章中,我解释了深度克隆和浅层克隆之间的区别 , 以及复制构造函数和防御性复制方法比默认的Java克隆如何更好. 使用复制构造函数和防御性复制方法进行的Java对象克隆 ...
最新文章
- as3直接播放flv基本代码
- 爷青回!16年前“打球AI”意外走红,程序员留下了自己的ICQ和MSN
- Method Tracking
- 小程序真机测试「启动参数」解析出错问题
- ef mysql 的坑_C# EF 与 MySql 的那些坑
- python 树状图代码_Python 无限级分类树状结构生成算法 「实用代码」
- 单目相机内参标定的问题
- 模拟电子技术基础笔记(2)——半导体基础知识
- 史上超全web渗透测试思维导图
- c语言 复制到编辑页面 乱码,富文本编辑器的复制word到浏览器发生乱码(vue+wangEditor)...
- 实现360浏览器内核模式切换
- 三星手机性能测试软件,5部手机性能测试:红米垫底三星倒数第三 第一当之无愧...
- appcrash事件怎么解决?三种方法教你
- PostgreSQL DBA(81) - Locks(FOR UPDATE SKIP LOCKED)
- HarmonyOS实现点亮LED
- 远程连接华为云服务器上的MySQL
- 关闭tomcat6下的stdout日志
- 木舟总结 | 2021年推文笔记分类汇总
- acwing-Diango项目 (后半)
- 人生苦短,我用Python;平台无限多,最棒大蟒蛇anaconda!
热门文章
- 如何修改Tomcat版本
- 零起点入门系列:如何把一张纸单变成在线表单?
- 南大网院计算机基础第一次作业,南大网院2015计算机基础第一次作业.docx
- 计算机office demo,办公软件应用(Office2007)中级 DEMO盘-2013.doc
- 计算机课题立项申报书范文,专项课题立项申报书模板.doc
- 嘉立创PCB CAM软件
- SVN教程代码比较(图文教程)
- CSDN 原力 -- beta 测试中
- Dev中ChartControl——属性熟悉与简单应用
- MATLAB机械动力分析,基于MATLAB的柔性机械臂动力学分析