任务分配

题目描述:对于一组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);
    }
}

 

posted @ 2017-04-12 15:51  临江仙zhe  阅读(170)  评论(0)    收藏  举报