任务分配
题目描述:对于一组case列表和服务器列表,每个服务器上有自己的任务队列,要把给定的case列表均衡的分配到各个服务器,保证每个服务器上的任务队列值差值最小。同时按照给定的返回格式返回所有case和它所分配的机器,以及机器上最终的任务队列值。没有分配到新任务的服务器队列中caseID用NA表示。
输入
两个字符串
1)caseID列表字符串
2)服务器IP(IP名唯一),服务器任务队列数值 成对格式字符串
输出
字符串类型格式 返回内容:分配列表格式字符串
注:没有分配到任务的服务器IP用NA表示。包含caseID,服务器IP(IP名称唯一),服务器任务队列值 具体格式如下:[caseID,IP1:队列值]
样例输入:
5,8,10,20,56,6,32
[IP1:5],[IP2:2],[IP3:0],[IP4:9]
样例输出:
[5,IP3:5],[6,IP3:5],[8,IP3:5],[10,IP3:5],[32,IP3:5],[56,IP2:4],[20,IP2:4],[NA,IP1:5],[NA,IP4:9]
Hint
服务器上任务分配要保证均衡
整体思路:
将输入的两行字符串分割,建立集合HashMap<String,Integer> hm IP和队列值的键值对,将现有的情况加入到集合
建立集合HashMap<String,String> hm1 caseID和IP的键值对
遍历任务队列,按队列值对服务器进行排序,将任务依次分给最前服务器,并将caseID和IP的对应关系存入hm1
遍历有序的hm集合(即遍历服务器),同时遍历hm1,将输出该服务器上分配的caseID
import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.Scanner; public class Main1 { /*请完成下面这个函数,实现题目要求的功能*/ /*当然,你也可以不按照下面这个模板来作答,完全按照自己的想法来 ^-^ */ /******************************开始写代码******************************/ static String CaseServerBalance(String caseList, String serQueList) { String str=""; String[] arr1=caseList.split(","); String[] arr2=serQueList.split(","); HashMap<String,Integer> hm=new HashMap<String,Integer>(); HashMap<String,String> hm1=new HashMap<String,String>(); for(int i=0;i<arr2.length;i++){ hm.put(arr2[i].substring(1,4),Integer.parseInt(arr2[i].substring(5,6))); } List<Map.Entry<String,Integer>> list=new ArrayList<Entry<String,Integer>>(hm.entrySet()); for(int i=0;i<arr1.length;i++){ Collections.sort(list, new Comparator<Map.Entry<String, Integer>>() { public int compare(Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2) { return (o1.getValue() - o2.getValue()); } }); hm.put(list.get(0).getKey(),list.get(0).getValue()+1); hm1.put(arr1[i],list.get(0).getKey()); } for (int i = 0; i < list.size(); i++) { String id = list.get(i).toString().substring(0,3); Iterator iter = hm1.entrySet().iterator(); while (iter.hasNext()) { Map.Entry entry = (Map.Entry) iter.next(); String key = (String)entry.getKey(); String val = (String)entry.getValue(); if(val.equals(id)){ str+="["+key+","+val+":"+list.get(i).toString().substring(4,5)+"]"+","; } } if(!hm1.containsValue(id)){ str+="[NA,"+id+":"+list.get(i).toString().substring(4,5)+"]"+","; } } str=str.substring(0,str.length()-1); return str; } /******************************结束写代码******************************/ public static void main(String[] args){ Scanner in = new Scanner(System.in); String res; String _caseList; try { _caseList = in.nextLine(); } catch (Exception e) { _caseList = null; } String _serQueList; try { _serQueList = in.nextLine(); } catch (Exception e) { _serQueList = null; } res = CaseServerBalance(_caseList, _serQueList); System.out.println(res); } }

浙公网安备 33010602011771号