diff --git a/bin/App.class b/bin/App.class index 01dfcb4..a1337e9 100644 Binary files a/bin/App.class and b/bin/App.class differ diff --git a/bin/BreakSchedule.class b/bin/BreakSchedule.class index a590c59..1dc403c 100644 Binary files a/bin/BreakSchedule.class and b/bin/BreakSchedule.class differ diff --git a/bin/Co2Data.class b/bin/Co2Data.class index bd02c1e..cec42f0 100644 Binary files a/bin/Co2Data.class and b/bin/Co2Data.class differ diff --git a/bin/Teacher.class b/bin/Teacher.class index 62f8a1c..69117f6 100644 Binary files a/bin/Teacher.class and b/bin/Teacher.class differ diff --git a/src/App.java b/src/App.java index 0b0ede2..7fe1158 100644 --- a/src/App.java +++ b/src/App.java @@ -8,58 +8,94 @@ import java.util.Scanner; public class App { // #region app constants private static final Scanner scanner = new Scanner(System.in); - private static final Teacher[] teachers = new Teacher[Teacher.nameMap.size()]; + private static Teacher[] teachers = new Teacher[Teacher.nameMap.size()]; // problem - // Room channel numbers, sorted asc. 37, 38, 39 + // Room channel numbers, sorted in ascending order: 37, 38, 39 private static final int[] ROOM_NUMBERS = { 1521263, 1364580, 1521262 }; - // Date and time constants for Start and End Dates + // Date constants for Start and End Dates private static final String[] DATES = { "2024-11-04", "2024-11-05", "2024-11-06", "2024-11-07", "2024-11-08" }; - private static ArrayList SHORT_BREAKS = new ArrayList(); - private static ArrayList LONG_BREAKS = new ArrayList(); + private static final ArrayList SHORT_BREAKS = new ArrayList<>(); + private static final ArrayList LONG_BREAKS = new ArrayList<>(); // #region Initialization - public static URL generateLink(int channelNumber, String date) throws MalformedURLException { String baseUrl = "https://api.thingspeak.com/channels/"; String formattedStartDateTime = date + " 07:00:00"; String formattedEndDateTime = date + " 19:00:00"; - return new URL(baseUrl + channelNumber + "/feeds.csv?start=" + formattedStartDateTime.replace(" ", "%20") - + "&end=" + formattedEndDateTime.replace(" ", "%20")); // %20 --> " " - + return new URL(baseUrl + channelNumber + "/feeds.csv?start=" + + formattedStartDateTime.replace(" ", "%20") + + "&end=" + formattedEndDateTime.replace(" ", "%20")); } private static void calculateBreakPoints(Break calcBreak, Teacher teacher) { int duration = calcBreak.getEnd() - calcBreak.getStart(); Co2Data[] minuteData = calcBreak.getCo2Datas(); + + if (minuteData.length != duration) { + System.out.println("Data inconsistency detected: duration mismatch."); + return; + } + int breakPoints = minuteData.length; - if (duration == minuteData.length) { - for (int i = 0; i < duration; i++) { - if (i + 1 != duration && (minuteData[i].getCo2Level() < minuteData[i + 1].getCo2Level())) { - breakPoints--; - } + for (int i = 0; i < duration - 1; i++) { + if (minuteData[i].getCo2Level() < minuteData[i + 1].getCo2Level()) { + breakPoints--; } - } else - System.out.println("Unexpected error"); + } + if (duration > 5) { teacher.addPoints(0, breakPoints, 0); } else { teacher.addPoints(breakPoints, 0, 0); } - // check if next lesson is lunch another teacher or the same and plan - // accordingly + // bonus Point for teacher switch } private static void initializeTeachers() { + // Mapping short names to full teacher names + Teacher.nameMap.put("Hm", "Johann Hummel"); + Teacher.nameMap.put("Bd", "Fender Bender"); + Teacher.nameMap.put("Bu", "Luca Burger"); + Teacher.nameMap.put("Cg", "Jesus Chung"); + Teacher.nameMap.put("Do", "Brother Doe"); + Teacher.nameMap.put("Eh", "Johnny Ehrlich"); + Teacher.nameMap.put("Fh", "Karl Fischer"); + Teacher.nameMap.put("Gi", "Bobby Giordano"); + Teacher.nameMap.put("Gr", "Graham"); + Teacher.nameMap.put("Hi", "Higgins"); + Teacher.nameMap.put("Kg", "Kang"); + Teacher.nameMap.put("Kh", "Khan"); + Teacher.nameMap.put("Lz", "Lozano"); + Teacher.nameMap.put("Lu", "Lund"); + Teacher.nameMap.put("Or", "Ortega"); + Teacher.nameMap.put("Re", "Reyes"); + Teacher.nameMap.put("Se", "Seng"); + Teacher.nameMap.put("Ts", "Tanaka"); + Teacher.nameMap.put("Vt", "Vetter"); + Teacher.nameMap.put("Zu", "Zuniga"); + Teacher.nameMap.put("Kp", "Kevin Peters"); + Teacher.nameMap.put("KP", "Kevin Peters"); + Teacher.nameMap.put("Ba", "Barbara Allen"); + Teacher.nameMap.put("Bz", "Basil Zephyr"); + Teacher.nameMap.put("Hn", "Hannah Nguyen"); + Teacher.nameMap.put("Le", "Full Name for Le"); + Teacher.nameMap.put("Du", "Full Name for Du"); + Teacher.nameMap.put("Bt", "Full Name for Bt"); + Teacher.nameMap.put("Es", "Full Name for Es"); + Teacher.nameMap.put("Hu", "Full Name for Hu"); + Teacher.nameMap.put("Ge", "Full Name for Ge"); + + // Initialize the teachers array with the size of nameMap + teachers = new Teacher[Teacher.nameMap.size()]; + int index = 0; for (String initial : Teacher.nameMap.keySet()) { Teacher teacher = new Teacher(initial); - Points points = new Points(); // Initialize Points object for each teacher - teacher.setPoints(points.getLongerBreak(), points.getBonusPoints(), points.getFiveMinuteBreak()); teachers[index++] = teacher; } } @@ -71,10 +107,26 @@ public class App { if (scanner.hasNextInt()) { return scanner.nextInt(); } - scanner.next(); // Clear invalid input + System.out.println("Invalid input. Please enter a number."); + scanner.next(); } } + private static void interactWithUser() { + while (true) { + int userInput = getUserInput("Do you want to see how the points were calculated? (1 = Yes, 0 = No)"); + if (userInput == 1) { + printExplanation(); + break; + } else if (userInput == 0) { + break; + } else { + System.out.println("Invalid input. Please enter 1 for Yes or 0 for No."); + } + } + printShutdown(); + } + // #region Explanation private static void printExplanation() { System.out.println("Point calculation explanation:"); @@ -83,8 +135,8 @@ public class App { System.out.println("3. 5 bonus points for teacher switches in classrooms."); } - // #region shutdown - private static void printShutDown() { + // #region Shutdown + private static void printShutdown() { System.out.println("Shutting down..."); for (int i = 3; i > 0; i--) { System.out.print(i + "..."); @@ -96,94 +148,100 @@ public class App { } } - // #TODO: remove this before hand-in deadline - public static void debbugingValueLists(List data) { - // Debugging co2Data - int index = 0; - for (Co2Data a : data) { - System.out.println(a.toString()); - index++; - } - - System.out.println("-----------------"); - System.out.println(index); - } - - // #TODO - // #region Print & sort + // #region Print & Sort private static void sortTeachers() { - // Sorting teachers by total points (implement sorting logic based on points) Arrays.sort(teachers, - (a, b) -> Integer.compare(b.getPoints().getTotalPoints(), a.getPoints().getTotalPoints())); + (a, b) -> Integer.compare(b.getTotalPoints(), a.getTotalPoints())); } private static void printTeachers() { int rank = 1; int previousPoints = -1; - int currentRank = 1; for (int i = 0; i < teachers.length; i++) { Teacher teacher = teachers[i]; - int teacherPoints = teacher.getPoints().getTotalPoints(); // Assuming points are available in getPoints() + int teacherPoints = teacher.getTotalPoints(); - if (teacherPoints == previousPoints) { - System.out.println(currentRank + ". " + teacher.getName() + " " + teacherPoints); - } else { - if (i > 0) { - rank += (i - (currentRank - 1)); - } - currentRank = rank; - System.out.println(rank + ". " + teacher.getName() + " " + teacherPoints); + if (teacherPoints != previousPoints) { + rank = i + 1; + previousPoints = teacherPoints; } - - previousPoints = teacherPoints; + System.out.println(rank + ". " + teacher.getName() + " - Points: " + teacherPoints); } } - // #region Main - public static void main(String[] args) throws MalformedURLException { - System.out.println("Calculations in process please do not shut off..."); - initializeTeachers(); + private static Teacher findTeacherForBreak(int breakIndex, TimeTable timeTable, int dayIndex) { + String teacherShortName = timeTable.getLesson(breakIndex, dayIndex); - ArrayList co2Datas = new ArrayList(); - for (int classrooms = 0; classrooms < 3; classrooms++) { - for (int weekday = 0; weekday < 5; weekday++) { - List tempData = Co2Data.getData(generateLink(ROOM_NUMBERS[classrooms], DATES[weekday])); - SHORT_BREAKS.add(BreakSchedule.createBreaks(BreakSchedule.START_SMALL_BREAK, - BreakSchedule.END_SMALL_BREAK, tempData)); - LONG_BREAKS.add(BreakSchedule.createBreaks(BreakSchedule.START_LONG_BREAK, - BreakSchedule.END_LONG_BREAK, tempData)); - } + if (teacherShortName == null || teacherShortName.isEmpty()) { + System.out.println("No teacher assigned during this break."); + return null; + } + if (!Teacher.nameMap.containsKey(teacherShortName) && teacherShortName != "Lunch") { + System.out.println("Teacher with short name " + teacherShortName + " not found in Teacher.nameMap."); + return null; } - calculateBreakPoints(SHORT_BREAKS.get(0)[0], teachers[0]); - - // Loop threw each day with a specific classroom and after the weekdays are over - // go to the next of the 3 classroms - // go threw every break calculate the point and give them to the teacher - // directly - // remember the point class - // BreakSchedule needed - - sortTeachers(); - printTeachers(); - - while (true) { - int userInput = getUserInput( - "Do you want to see how the points were calculated? (Yes 1, No 0; anything is an error)"); - if (userInput == 1) { - printExplanation(); - // add a more detailed listing of the teacher since points can be broken down - // further - printShutDown(); - break; - } else if (userInput == 0) { - printShutDown(); - break; - } else { - System.out.println("Invalid input. Please enter 1 for Yes or 0 for No."); + String fullName = Teacher.nameMap.get(teacherShortName); + for (Teacher teacher : teachers) { + if (teacher.getName().equals(fullName)) { + return teacher; } } - scanner.close(); + return null; + } + + // #region main + public static void main(String[] args) { + try { + System.out.println("Calculations in process. Please do not shut off..."); + initializeTeachers(); + + for (int roomIndex = 0; roomIndex < ROOM_NUMBERS.length; roomIndex++) { + TimeTable timeTable = new TimeTable(roomIndex); + + for (String date : DATES) { + try { + List tempData = Co2Data.getData(generateLink(ROOM_NUMBERS[roomIndex], date)); + if (tempData == null || tempData.isEmpty()) { + System.out + .println("No data available for " + date + " in Room" + (roomIndex + 37) + "."); + continue; + } + + Break[] shortBreaks = BreakSchedule.createBreaks( + BreakSchedule.START_SMALL_BREAK, BreakSchedule.END_SMALL_BREAK, tempData); + + Break[] longBreaks = BreakSchedule.createBreaks( + BreakSchedule.START_LONG_BREAK, BreakSchedule.END_LONG_BREAK, tempData); + + for (int i = 0; i < shortBreaks.length; i++) { + Teacher teacher = findTeacherForBreak(i, timeTable, Arrays.asList(DATES).indexOf(date)); + if (teacher != null) { + calculateBreakPoints(shortBreaks[i], teacher); + } + } + + for (int i = 0; i < longBreaks.length; i++) { + Teacher teacher = findTeacherForBreak(i, timeTable, Arrays.asList(DATES).indexOf(date)); + if (teacher != null) { + calculateBreakPoints(longBreaks[i], teacher); + } + } + } catch (Exception e) { + System.out.println("Error processing data for date: " + date + ". " + e.getMessage()); + } + } + } + + sortTeachers(); + printTeachers(); + interactWithUser(); + + } catch (Exception e) { + System.out.println("Fatal error: " + e.getMessage()); + } finally { + scanner.close(); + } } } diff --git a/src/BreakSchedule.java b/src/BreakSchedule.java index 7fc7b50..ca2b2c2 100644 --- a/src/BreakSchedule.java +++ b/src/BreakSchedule.java @@ -23,7 +23,6 @@ public class BreakSchedule { Co2Data[] co2Datas = new Co2Data[endTimes[i] - startTimes[i]]; for (Co2Data data : co2Data) { if (data.getTime() >= startTimes[i] && data.getTime() < endTimes[i]) { - System.out.println(startTimes[i] + " " + endTimes[i] + " " + data.getTime()); co2Datas[data.getTime() - startTimes[i]] = data; } } diff --git a/src/Co2Data.java b/src/Co2Data.java index fd8154d..3a8194d 100644 --- a/src/Co2Data.java +++ b/src/Co2Data.java @@ -59,7 +59,6 @@ public class Co2Data { br.readLine(); // Skip header line String output; - System.out.println(url); while ((output = br.readLine()) != null) { Co2Data data = parseData(output); if (data != null) { diff --git a/src/Teacher.java b/src/Teacher.java index c414631..495ddb6 100644 --- a/src/Teacher.java +++ b/src/Teacher.java @@ -1,73 +1,39 @@ -import java.util.Collections; import java.util.HashMap; import java.util.Map; public class Teacher { - // #region Fields - private String name; - private Map timetable = new HashMap<>(); // Map of Day -> Teachers in class for that day - private Points points; // Points field to store teacher's points - public static final Map nameMap = new HashMap<>(); + private String shortName; + private String name; + private int totalPoints; - // #region Initialization - static { - // Mapping short names to full teacher names - nameMap.put("Hm", "Johann Hummel"); - nameMap.put("Bd", "Fender Bender"); - nameMap.put("Bu", "Luca Burger"); - nameMap.put("Cg", "Jesus Chung"); - nameMap.put("Do", "Brother Doe"); - nameMap.put("Eh", "Johnny Ehrlich"); - nameMap.put("Fh", "Karl Fischer"); - nameMap.put("Gi", "Bobby Giordano"); - nameMap.put("Gr", "Graham"); - nameMap.put("Hi", "Higgins"); - nameMap.put("Kg", "Kang"); - nameMap.put("Kh", "Khan"); - nameMap.put("Lz", "Lozano"); - nameMap.put("Lu", "Lund"); - nameMap.put("Or", "Ortega"); - nameMap.put("Re", "Reyes"); - nameMap.put("Se", "Seng"); - nameMap.put("Ts", "Tanaka"); - nameMap.put("Vt", "Vetter"); - nameMap.put("Zu", "Zuniga"); + // Constructor + public Teacher(String shortName) { + this.shortName = shortName; + this.name = nameMap.get(shortName); + this.totalPoints = 0; } - // #region Constructor - public Teacher(String name) { - // Use the short name to find the full name from the nameMap - this.name = nameMap.getOrDefault(name, "Unknown"); - this.points = new Points(); // Initialize Points object when Teacher is created + // Getters + public String getShortName() { + return shortName; } - // #region Getters and Setters public String getName() { - return name; // Return the teacher's full name - } - - public Map getTimetable() { - return Collections.unmodifiableMap(timetable); // Return an unmodifiable view of the timetable - } - - public Points getPoints() { - return points; // Return the Points object associated with the teacher - } - - public void setPoints(int fiveMinute, int tenMinutes, int bonusPoints) { - this.points.setFiveMinuteBreak(fiveMinute); - this.points.setLongerBreak(tenMinutes); - this.points.setBonusPoints(bonusPoints); - } - - public void addPoints(int fiveMinute, int tenMinutes, int bonusPoints) { - this.points.addFiveMinuteBreakPoints(fiveMinute); - this.points.addLongerBreakPoints(tenMinutes); - this.points.addBonusPoints(bonusPoints); + return name; } public int getTotalPoints() { - return this.points.getTotalPoints(); + return totalPoints; + } + + // Setters + public void setTotalPoints(int points) { + this.totalPoints = points; + } + + // Method to add points + public void addPoints(int smallBreakPoints, int longBreakPoints, int bonusPoints) { + this.totalPoints += smallBreakPoints + longBreakPoints + bonusPoints; } }