按月或周循环分配排日计划任务
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)); }); } }