-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathNewFile5.java
More file actions
299 lines (223 loc) · 11.7 KB
/
Copy pathNewFile5.java
File metadata and controls
299 lines (223 loc) · 11.7 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
import java.time.DayOfWeek;
import java.time.LocalDate;
import java.util.*;
public class NewFile5 {
private static Scanner scanner = new Scanner(System.in);
private static Map<String, Set<LocalDate>> programAssignedDates = new HashMap<>();
private static Map<String, Map<String, Map<String, List<String>>>> universityDetails = new HashMap<>();
public static void main(String[] args) {
// Input number of schools
int numberOfSchools = getNumberOfSchools(scanner);
// Input details for each school
for (int schoolIndex = 1; schoolIndex <= numberOfSchools; schoolIndex++) {
String schoolName = getSchoolName(scanner, "Enter the name of School " + schoolIndex + ": ");
universityDetails.put(schoolName, new HashMap<>());
// Input number of programs for the school
int numberOfPrograms = getNumberOfPrograms(scanner, "Enter the number of programs for " + schoolName + ": ");
// Input details for each program
for (int programIndex = 1; programIndex <= numberOfPrograms; programIndex++) {
String programName = getProgramName(scanner, "Enter the name of Program " + programIndex + ": ");
universityDetails.get(schoolName).put(programName, new HashMap<>());
// Input number of semesters for the program
int numberOfSemesters = getNumberOfSemesters(scanner, "Enter the number of semesters for " + programName + ": ");
// Input number of courses for each semester
for (int semesterIndex = 1; semesterIndex <= numberOfSemesters; semesterIndex++) {
String semester = getSemesterName(scanner, "Enter the name of Semester " + semesterIndex + ": ");
int numberOfCoursesInSemester = getNumberOfCourses(scanner, "Enter the number of courses for " + semester + ": ");
List<String> courseNames = getCourseNames(scanner, numberOfCoursesInSemester);
universityDetails.get(schoolName).get(programName).put(semester, courseNames);
}
}
}
// Input date range
LocalDate startDate = getDateFromUser("Enter the start date (yyyy-MM-dd): ");
LocalDate endDate = getDateFromUser("Enter the end date (yyyy-MM-dd): ");
// Generate and assign random dates for each course
generateAndAssignRandomDatesAndShifts(startDate, endDate);
// Display the assigned dates
scanner.close();
}
private static String getSchoolName(Scanner scanner, String prompt) {
System.out.print(prompt);
return scanner.next();
}
private static String getProgramName(Scanner scanner, String prompt) {
System.out.print(prompt);
return scanner.next();
}
private static String getSemesterName(Scanner scanner, String prompt) {
System.out.print(prompt);
return scanner.next();
}
private static int getNumberOfSchools(Scanner scanner) {
int numberOfSchools = 0;
boolean validInput = false;
while (!validInput) {
System.out.print("Enter the number of schools: ");
if (scanner.hasNextInt()) {
numberOfSchools = scanner.nextInt();
validInput = true;
} else {
System.out.println("Error: Please enter a valid integer.");
scanner.next(); // Consume the invalid input
}
}
return numberOfSchools;
}
private static int getNumberOfPrograms(Scanner scanner, String prompt) {
int numberOfPrograms = 0;
boolean validInput = false;
while (!validInput) {
System.out.print(prompt);
if (scanner.hasNextInt()) {
numberOfPrograms = scanner.nextInt();
validInput = true;
} else {
System.out.println("Error: Please enter a valid integer.");
scanner.next(); // Consume the invalid input
}
}
return numberOfPrograms;
}
private static int getNumberOfSemesters(Scanner scanner, String prompt) {
int numberOfSemesters = 0;
boolean validInput = false;
while (!validInput) {
System.out.print(prompt);
if (scanner.hasNextInt()) {
numberOfSemesters = scanner.nextInt();
validInput = true;
} else {
System.out.println("Error: Please enter a valid integer.");
scanner.next(); // Consume the invalid input
}
}
return numberOfSemesters;
}
private static int getNumberOfCourses(Scanner scanner, String prompt) {
int numberOfCourses = 0;
boolean validInput = false;
while (!validInput) {
System.out.print(prompt);
if (scanner.hasNextInt()) {
numberOfCourses = scanner.nextInt();
validInput = true;
} else {
System.out.println("Error: Please enter a valid integer.");
scanner.next(); // Consume the invalid input
}
}
return numberOfCourses;
}
private static List<String> getCourseNames(Scanner scanner, int numberOfCourses) {
List<String> courseNames = new ArrayList<>();
for (int i = 1; i <= numberOfCourses; i++) {
System.out.print("Enter the name of Course " + i + ": ");
courseNames.add(scanner.next());
}
return courseNames;
}
private static LocalDate getDateFromUser(String prompt) {
LocalDate date = null;
boolean validInput = false;
while (!validInput) {
try {
System.out.print(prompt);
String dateString = scanner.next();
date = LocalDate.parse(dateString);
validInput = true;
} catch (Exception e) {
System.out.println("Error: Please enter a valid date in the format yyyy-MM-dd.");
}
}
return date;
}
private static String getCourseNamesAsString(String schoolName, String programName, String semester) {
List<String> courseNames = universityDetails.get(schoolName).get(programName).get(semester);
return String.join(", ", courseNames);
}
private static void generateAndAssignRandomDatesAndShifts(LocalDate startDate, LocalDate endDate) {
String semesterType = getSemesterType(scanner);
for (String schoolName : universityDetails.keySet()) {
for (String programName : universityDetails.get(schoolName).keySet()) {
for (String semester : universityDetails.get(schoolName).get(programName).keySet()) {
int semesterIndex = Integer.parseInt(semester);
// Check if the semester type matches user choice
if ((semesterIndex % 2 == 1 && semesterType.equals("odd")) || (semesterIndex % 2 == 0 && semesterType.equals("even"))) {
List<String> courseNames = universityDetails.get(schoolName).get(programName).get(semester);
assignCoursesToSemester(schoolName, programName, semester, courseNames, startDate, endDate);
}
}
}
}
}
private static String getSemesterType(Scanner scanner) {
String semesterType = "";
while (!semesterType.equals("odd") && !semesterType.equals("even")) {
System.out.print("Enter 'odd' or 'even' to assign dates to semesters: ");
semesterType = scanner.next().toLowerCase();
}
return semesterType;
}
private static void assignCoursesToSemester(String schoolName, String programName, String semester, List<String> courseNames, LocalDate startDate, LocalDate endDate) {
System.out.println("Assigning courses for " + schoolName + " - " + programName + " - " + semester);
System.out.println("|--------------------------|---------------|----------------|--------------|--------------------|");
System.out.println("| Program | Semester | Course | Date | Timing |");
System.out.println("|--------------------------|---------------|----------------|--------------|--------------------|s");
// Generate random dates and shifts for the current semester
List<LocalDate> semesterRandomDates = generateRandomDates(courseNames.size(), programName, startDate, endDate);
List<ShiftCourse> semesterRandomShifts = generateRandomShifts(courseNames.size());
Iterator<LocalDate> dateIterator = semesterRandomDates.iterator();
Iterator<ShiftCourse> shiftIterator = semesterRandomShifts.iterator();
for (String courseName : courseNames) {
if (dateIterator.hasNext() && shiftIterator.hasNext()) {
LocalDate randomDate = dateIterator.next();
ShiftCourse randomShift = shiftIterator.next();
// Check if the date is not a Sunday
if (randomDate.getDayOfWeek() != DayOfWeek.SUNDAY) {
// Add the date and shift to the program's semester
String key = programName + "-" + semester;
programAssignedDates.computeIfAbsent(key, k -> new HashSet<>()).add(randomDate);
System.out.println("\t"+programName + "\t\t" + semester + "\t\t" + courseName + "\t\t" + randomDate + "\t" + randomShift);
System.out.println("|--------------------------|---------------|----------------|--------------|--------------------|");
} else {
// If it's a Sunday, skip this date and shift and try the next one
dateIterator.remove();
shiftIterator.remove();
}
}
}
}
private static List<LocalDate> generateRandomDates(int numberOfDates, String programKey, LocalDate startDate, LocalDate endDate) {
List<LocalDate> randomDates = new ArrayList<>();
Set<LocalDate> uniqueDates = new HashSet<>();
Random random = new Random();
while (uniqueDates.size() < numberOfDates) {
long startEpochDay = startDate.toEpochDay();
long endEpochDay = endDate.toEpochDay();
long randomEpochDay = startEpochDay + random.nextInt((int) (endEpochDay - startEpochDay + 1));
LocalDate randomDate = LocalDate.ofEpochDay(randomEpochDay);
// Check if the date is unique for the program and not a Sunday
if (randomDate.getDayOfWeek() != DayOfWeek.SUNDAY && uniqueDates.add(randomDate) && isDateUniqueForProgram(programKey, randomDate)) {
randomDates.add(randomDate);
}
}
return randomDates;
}
private static List<ShiftCourse> generateRandomShifts(int numberOfShifts) {
List<ShiftCourse> randomShifts = new ArrayList<>();
Random random = new Random();
for (int i = 0; i < numberOfShifts; i++) {
int shiftIndex = random.nextInt(2); // 0 for Morning, 1 for Afternoon
randomShifts.add(ShiftCourse.values()[shiftIndex]);
}
return randomShifts;
}
private static enum ShiftCourse {
MORNING, AFTERNOON
}
private static boolean isDateUniqueForProgram(String programKey, LocalDate date) {
Set<LocalDate> assignedDates = programAssignedDates.computeIfAbsent(programKey, k -> new HashSet<>());
return assignedDates.add(date);
}
}