Java统计各个时段上的人数

Java统计各个时段上的人数

场景重现:
我们将一天分割成24份,每份间隔1小时,[0-1],[1-2],[2-3]…,[23-0]
根据考勤时间,然后我们统计一下,在各个时段上加班的人数。

实现步骤: 
步骤一、时间段分割: 将个人加班时间,分割成多个,匹配上面的24个时段。
步骤二、将每个人分割后的时间片段汇总到一个集合中,然后统计出每个时间片段的总数。

步骤一:
给你个开始时间,一个结束时间,将这个时间间隔分割,匹配到上面的24个时间段上。
比如,
开始时间:“2019-09-23 10:30”,
结束时间:“2019-09-23 19:30”
要求分割结果为:[10-11],[11-12],[12-13],[13-14],[14-15],[15-16],[16-17],[17-18],[18-19],[19-20]

实现方法:

    /**
     * 【开始时间,结束时间】把时间段按每1小时切割一次
     * 我们把一天切割为24段,将给定的时间段进行切割,匹配到这些时间段上。
     * @param startDateTime 开始时间
     * @param endDateTime 结束时间
     * @return
     */
    public static List<String> cutInterval(String startDateTime, String endDateTime){
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");
        LocalDateTime localDateTime1 =LocalDateTime.parse(startDateTime, formatter);
        LocalDateTime end =LocalDateTime.parse(endDateTime, formatter);

        //秒数置为0
        LocalDateTime start = localDateTime1.withMinute(0);
        System.out.println(localDateTime1);

        String str = start.format(formatter);
        System.out.println(str);

        //时间段分割
        List<String> list = new ArrayList<>();
        while(start.plusHours(1).isBefore(end.plusHours(1)))
        {
            list.add(start.getHour()+"-"+start.plusHours(1).getHour());
            start=start.plusHours(1);
        }

        list.forEach(item-> System.out.println(item));

        return list;
    }

在这里插入图片描述

    public static void main(String[] args) {
        List<String> list = cutInterval("2019-09-24 17:30","2019-09-24 22:00");
        System.out.println("====================================");
        List<String> list2 = cutInterval("2019-09-24 17:30","2019-09-24 22:00");
        System.out.println("====================================");
        List<String> list3 = cutInterval("2019-09-23 17:30","2019-09-23 23:30");
        System.out.println("====================================");
        List<String> list4 = cutInterval("2019-09-24 18:00","2019-09-25 23:00");
        System.out.println("====================================");
        List<String> list5 = cutInterval("2019-09-23 10:00","2019-09-23 19:30");

        System.out.println("*****************************************************");
        List<String> resultList = new ArrayList<>();
        resultList.addAll(list);
        resultList.addAll(list2);
        resultList.addAll(list3);
        resultList.addAll(list4);
        resultList.addAll(list5);
        ListUtils.getCountMap(resultList);
    }

步骤二:
就是统计List集合中,各个时间片段的总个数。
这里使用java8中的stream,来进行分组统计。

    /**
     * 分组,统计list中每个元素出现的次数
     * @param list
     * @return
     */
    public static Map<String,Long> getCountMap(List<String> list){
        Map<String,Long> map = list.stream().collect(Collectors.groupingBy(p->p,Collectors.counting()));
        map.forEach((k,v) -> System.out.println(k + ":" +v));

        return map;
    }

在这里插入图片描述

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值