按月或周循环分配排日计划任务

import cn.hutool.core.date.DateField;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;

import java.util.*;

public class ListScheduler {

    /**
     * @param tasks     任务元素
     * @param round     任务重复轮次
     * @param frequency 任务频率
     * @param type      任务频率类型 0-天 1-周 2-月
     * @return 按天排的任务
     */
    public static <T> Map<Date, List<T>> scheduleTasks(List<T> tasks, int round, int frequency, int type) {
        // 处理无效输入:任务列表为空、重复次数round或月数frequency非正
        if (tasks == null || tasks.isEmpty() || round <= 0 || frequency <= 0 || !Arrays.asList(0, 1, 2).contains(type)) {
            return Collections.emptyMap();
        }

        // 生成重复round次后的任务列表
        List<T> repeatedTasks = new ArrayList<>();
        for (int i = 0; i < round; i++) {
            repeatedTasks.addAll(tasks);
        }

        List<DateTime> dateRange = getDateRange(frequency, type);

        // 将任务按顺序循环分配到每个日期
        Map<Date, List<T>> schedule = new LinkedHashMap<>();
        int taskSize = repeatedTasks.size();
        int dateSize = dateRange.size();
        if (taskSize <= dateSize) {
            for (int i = 0; i < taskSize; i++) {
                Date date = dateRange.get(i);
                T task = repeatedTasks.get(i);
                schedule.put(date, Arrays.asList(task));
            }
        } else {
            for (int i = 0; i < taskSize; i++) {
                Date date = dateRange.get(i % dateSize);
                T task = repeatedTasks.get(i);
                if (schedule.get(date) != null) {
                    schedule.get(date).add(task);
                } else {
                    ArrayList<T> subTask = new ArrayList<>();
                    subTask.add(task);
                    schedule.put(date, subTask);
                }
            }
        }
        return schedule;
    }

    /**
     * @param offset 偏移量
     * @param type   0-天 1-周 2-月
     * @return
     */
    public static List<DateTime> getDateRange(int offset, int type) {
        switch (type) {
            case 0: {
                DateTime start = DateUtil.beginOfDay(DateUtil.date());
                ArrayList<DateTime> result = new ArrayList<>();
                result.add(start);
                return result;
            }
            case 1: {
                DateTime start = DateUtil.beginOfDay(DateUtil.date());// 获取当天的开始时间(00:00:00),去掉时分秒
                DateTime end = DateUtil.offsetWeek(start, offset);
                return DateUtil.rangeToList(start, end, DateField.DAY_OF_MONTH);
            }
            case 2: {
                Date start = DateUtil.beginOfDay(DateUtil.date());// 获取当天的开始时间(00:00:00),去掉时分秒
                DateTime end = DateUtil.offsetMonth(start, offset);
                return DateUtil.rangeToList(start, end, DateField.DAY_OF_MONTH);
            }
        }
        return null;
    }

    public static void main(String[] args) {
        List<String> tasks = new ArrayList<>();
        for (int i = 0; i < 364; i++) {
            tasks.add("task" + i);
        }
        Map<Date, List<String>> localDateStringMap = scheduleTasks(tasks, 1, 2, 1);
        localDateStringMap.forEach((k, v) -> {
            System.out.println("日期:" + k + "任务:" + String.join(",", v));
        });

    }

}

 

posted @ 2025-04-15 15:36  墨竹丶蝉翼  阅读(15)  评论(0)    收藏  举报