【部门排序】

题目描述

公司hr想要分析各个研究所所在城市的主力业务分布。给定一批部门信息记录于数组departments,
departments[i]格式为city departmentName personNum,分别带别该部门所在城市、部门名称、人数
1、先从每个城市选取人数多最多的5个部门作为分析对象,当人数相等时优先取departmentName字典序小的
注:不足5个部门的城市,按实际个数选取
2、然后对于选取的结果,按格式city departmentName逐行输出。首先按city字典升序输出;同一个城市内,
按departmentName字典升序输出

样例1

输入

 [["shenzhen", "ebg", 5],
 ["shenzhen", "dbg", 7],
 ["shenzhen", "cbg", 5],
 ["shenzhen", "abg", 6],
 ["shenzhen", "zbg", 5],
 ["shenzhen", "bbg", 4],
 ["beijing", "cbg", 1]]

输出

 [["beijing", "cbg"], ["shenzhen", "abg"], ["shenzhen", "cbg"], ["shenzhen", "dbg"], ["shenzhen", "ebg"], ["shenzhen", "zbg"]]

样例2

输入

 [["wuhan", "appdept", 100],
 ["wuhan", "app", 100],
 ["wuhan", "cpdept", 100],
 ["wuhan", "dock", 100],
 ["wuhan", "energy", 100],
 ["wuhan", "finance", 100]]

输出

 [["wuhan", "app"], ["wuhan", "appdept"], ["wuhan", "cpdept"], ["wuhan", "dock"], ["wuhan", "energy"]]

Java算法源码

package com.sre.oj.workinglevel;

import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Scanner;
import java.util.TreeMap;

public class DepartmentSort {

    public static void main(String[] args) {
        Scanner cin = new Scanner(System.in, StandardCharsets.UTF_8.name());
        while (cin.hasNext()) {
            List<Department> departments = new ArrayList<>();
            int groupNum = cin.nextInt();
            cin.nextLine();
            for (int i = 0; i < groupNum; i++) {
                Department department = new Department();
                String[] inputStr = cin.nextLine().split(" ");
                department.city = inputStr[0];
                department.departmentName = inputStr[1];
                department.personNum = Integer.parseInt(inputStr[2]);
                departments.add(department);
            }
            System.out.println(getTop5Department(departments));
        }
    }

    public static List<Department> getTop5Department(List<Department> departments) {
        Map<String, List<Department>> map = new TreeMap<>();
        for (Department department : departments) {
            String city = department.city;
            if (!map.containsKey(city)) {
                map.put(city, new ArrayList<>());
            }
            map.get(city).add(department);
        }

        for (String city : map.keySet()) {
            List<Department> list = map.get(city);
            list.sort((o1, o2) -> {
                int cmp = o2.personNum - o1.personNum;
                if (cmp == 0) {
                    return o1.departmentName.compareTo(o2.departmentName);
                }
                return cmp;
            });
            while (list.size() > 5) {
                list.remove(5);
            }
        }

        List<Department> result = new ArrayList<>();
        for (String city : map.keySet()) {
            result.addAll(map.get(city));
        }
        // 对result分别按照city departmentName personNum 升序排序
        result.sort((o1, o2) -> {
            int cmp = o1.city.compareTo(o2.city);
            if (cmp == 0) {
                cmp = o1.departmentName.compareTo(o2.departmentName);
            }
            return cmp;
        });
        return result;
    }
}
class Department {
    String city = null;
    String departmentName = null;
    int personNum = -1; // 返回时不需要赋值,也不会显示

    public String toString() {
        return String.format(java.util.Locale.ROOT, "[\"%s\", \"%s\"]",
            this.city, this.departmentName);
    }
}

测试数据

6
wuhan appdept 100
wuhan app 100
wuhan cpdept 100
wuhan dock 100
wuhan energy 100
wuhan finance 100
[["wuhan", "app"], ["wuhan", "appdept"], ["wuhan", "cpdept"], ["wuhan", "dock"], ["wuhan", "energy"]]
7
shenzhen ebg 5
shenzhen dbg 7
shenzhen cbg 5
shenzhen abg 6
shenzhen zbg 5
shenzhen bbg 4
beijing cbg 1
[["beijing", "cbg"], ["shenzhen", "abg"], ["shenzhen", "cbg"], ["shenzhen", "dbg"], ["shenzhen", "ebg"], ["shenzhen", "zbg"]]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

软软的铲屎官

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值