Last active
May 22, 2025 07:09
-
-
Save untainsYD/a3c3bff165294c82f6af702ff720e2f8 to your computer and use it in GitHub Desktop.
Laboratory 5, Task 3
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package lab5.archive; | |
import java.io.*; | |
import java.util.*; | |
import java.util.zip.*; | |
/** | |
* Клас для читання даних про академічні групи з ZIP-архіву. | |
*/ | |
public class ArchiveReader { | |
/** | |
* Читає академічні групи з ZIP-архіву | |
* @param archiveFileName ім'я архівного файлу | |
* @return список академічних груп | |
* @throws IOException у разі помилки читання | |
* @throws ClassNotFoundException у разі помилки десеріалізації | |
*/ | |
public static List<AcademicGroup> readGroupsFromArchive(String archiveFileName) throws IOException, ClassNotFoundException { | |
List<AcademicGroup> groups = new ArrayList<>(); | |
try (ZipInputStream zis = new ZipInputStream(new FileInputStream(archiveFileName))) { | |
ZipEntry entry; | |
System.out.println("=== Читання архіву: " + archiveFileName + " ==="); | |
while ((entry = zis.getNextEntry()) != null) { | |
System.out.println("Знайдено запис: " + entry.getName()); | |
if (entry.getName().endsWith(".dat")) { | |
// Читаємо серіалізовану групу (не використовуємо try-with-resources!) | |
ObjectInputStream ois = new ObjectInputStream(zis); | |
AcademicGroup group = (AcademicGroup) ois.readObject(); | |
groups.add(group); | |
System.out.println(" Десеріалізовано групу: " + group.getGroupName()); | |
// Не закриваємо ois, щоб не закрити zis | |
} else if (entry.getName().equals("archive_info.txt")) { | |
// Читаємо та виводимо інформаційний файл | |
System.out.println("\n=== Зміст інформаційного файлу ==="); | |
BufferedReader reader = new BufferedReader(new InputStreamReader(zis, "UTF-8")); | |
String line; | |
while ((line = reader.readLine()) != null) { | |
System.out.println(line); | |
} | |
System.out.println("=== Кінець інформаційного файлу ===\n"); | |
// Не закриваємо reader, щоб не закрити zis | |
} | |
zis.closeEntry(); | |
} | |
} | |
System.out.println("Загалом прочитано груп: " + groups.size()); | |
return groups; | |
} | |
/** | |
* Виводить детальну інформацію про групи | |
* @param groups список академічних груп | |
*/ | |
public static void displayGroupsInfo(List<AcademicGroup> groups) { | |
System.out.println("\n=== Детальна інформація про групи ==="); | |
for (int i = 0; i < groups.size(); i++) { | |
AcademicGroup group = groups.get(i); | |
System.out.println(String.format("\nГрупа %d: %s", i + 1, group.getGroupName())); | |
System.out.println("Спеціальність: " + group.getSpecialty()); | |
System.out.println("Рік вступу: " + group.getYear()); | |
System.out.println("Кількість студентів: " + group.getStudentCount()); | |
System.out.println("Середній бал групи: " + String.format("%.2f", group.getGroupAverageGrade())); | |
System.out.println("Список студентів:"); | |
Student[] students = group.getActiveStudents(); | |
for (int j = 0; j < students.length; j++) { | |
Student student = students[j]; | |
System.out.println(String.format(" %d. %s (ID: %d, курс: %d, середній бал: %.2f)", | |
j + 1, student.getFullName(), student.getStudentId(), | |
student.getCourse(), student.getAverageGrade())); | |
} | |
} | |
} | |
/** | |
* Показує статистику по всіх групах | |
* @param groups список академічних груп | |
*/ | |
public static void showStatistics(List<AcademicGroup> groups) { | |
System.out.println("\n=== Статистика ==="); | |
int totalStudents = 0; | |
double totalAverageGrade = 0.0; | |
Map<String, Integer> specialtyCount = new HashMap<>(); | |
for (AcademicGroup group : groups) { | |
totalStudents += group.getStudentCount(); | |
totalAverageGrade += group.getGroupAverageGrade(); | |
specialtyCount.put(group.getSpecialty(), | |
specialtyCount.getOrDefault(group.getSpecialty(), 0) + 1); | |
} | |
System.out.println("Загальна кількість груп: " + groups.size()); | |
System.out.println("Загальна кількість студентів: " + totalStudents); | |
System.out.println("Середній бал по всіх групах: " + | |
String.format("%.2f", totalAverageGrade / groups.size())); | |
System.out.println("Розподіл по спеціальностях:"); | |
for (Map.Entry<String, Integer> entry : specialtyCount.entrySet()) { | |
System.out.println(" " + entry.getKey() + ": " + entry.getValue() + " груп(и)"); | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment