java 实现工人四班三倒
时间: 2024-05-11 13:13:47 浏览: 127
以下是 Java 实现工人四班三倒的示例代码:
```java
import java.time.DayOfWeek;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
public class WorkerSchedule {
private final static int NUM_WORKERS = 12;
private final static int NUM_DAYS = 28;
private final static int NUM_SHIFTS = 4;
private final static int[][] schedule = new int[NUM_DAYS][NUM_SHIFTS];
public static void main(String[] args) {
generateSchedule();
printSchedule();
}
private static void generateSchedule() {
int[] workerShifts = new int[NUM_WORKERS];
for (int i = 0; i < NUM_WORKERS; i++) {
workerShifts[i] = 0;
}
for (int day = 0; day < NUM_DAYS; day++) {
for (int shift = 0; shift < NUM_SHIFTS; shift++) {
int worker = selectWorker(workerShifts);
schedule[day][shift] = worker;
workerShifts[worker]++;
}
}
}
private static int selectWorker(int[] workerShifts) {
int minShifts = Integer.MAX_VALUE;
int minShiftsWorker = -1;
for (int worker = 0; worker < NUM_WORKERS; worker++) {
if (workerShifts[worker] < minShifts) {
minShifts = workerShifts[worker];
minShiftsWorker = worker;
}
}
return minShiftsWorker;
}
private static void printSchedule() {
LocalDate startDate = LocalDate.now();
startDate = startDate.withDayOfMonth(1);
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MM/dd/yyyy");
System.out.println("Worker Schedule for " + startDate.format(formatter) + " - " + startDate.plusDays(NUM_DAYS - 1).format(formatter));
System.out.println("---------------------------------------------------------");
System.out.println(" Day 1 Day 2 Day 3 Day 4 Day 5 Day 6 Day 7");
for (int shift = 0; shift < NUM_SHIFTS; shift++) {
System.out.print("Shift " + (shift + 1) + ": ");
for (int day = 0; day < NUM_DAYS; day++) {
LocalDate date = startDate.plusDays(day);
DayOfWeek dayOfWeek = date.getDayOfWeek();
int worker = schedule[day][shift];
System.out.print(" " + (worker + 1) + " ");
if (dayOfWeek == DayOfWeek.SUNDAY || day == NUM_DAYS - 1) {
System.out.println();
}
}
}
}
}
```
该程序使用了一个二维数组来存储每个工人在每个班次的分配情况,然后使用一个 `selectWorker` 方法来选择下一个班次应该分配给哪个工人。该方法会遍历所有工人的分配情况,然后返回分配班次最少的工人的编号。
在 `generateSchedule` 方法中,程序会依次遍历每个班次,并将每个班次分配给一个工人。在分配班次时,程序会调用 `selectWorker` 方法来选择下一个可用的工人。
在 `printSchedule` 方法中,程序会按照一定的格式打印出工人的班次安排。其中,程序使用了 Java 8 中的日期和时间 API 来处理日期信息。程序会打印出每个班次的工人编号,并在每周的最后一天或者最后一天打印一个换行符,以便使输出更加清晰。