Skip to content

Instantly share code, notes, and snippets.

@untainsYD
Last active May 22, 2025 07:09
Show Gist options
  • Save untainsYD/a3c3bff165294c82f6af702ff720e2f8 to your computer and use it in GitHub Desktop.
Save untainsYD/a3c3bff165294c82f6af702ff720e2f8 to your computer and use it in GitHub Desktop.
Laboratory 5, Task 3
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