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));
});
}
}