/
java56
/
FindMaxNumber
Обзор
Документация
Войти
/
java56
/
FindMaxNumber
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
master
src/main/java/com/mikhail/digit/service/impl/FindMaxServiceImpl.java
63 строки
3 KB
Mikhail Gorbatenkov
15 - edit the service
23 фев 2025, 16:21
23 фев 2025, 16:21
1573493
Код
Авторство
О чём код?
package com.mikhail.digit.service.impl; import com.mikhail.digit.service.FindMaxService; import lombok.extern.slf4j.Slf4j; import org.apache.poi.ss.usermodel.*; import org.springframework.stereotype.Service; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.util.PriorityQueue; @Service @Slf4j public class FindMaxServiceImpl implements FindMaxService { @Override public Integer findNthMaxNumber(String filePath, int n) throws IOException { File file = new File(filePath); if (!file.exists() || !file.isFile()) { log.debug("Файл не найден по пути: {}", filePath); throw new FileNotFoundException("Файл не найден по указанному пути: " + filePath); } PriorityQueue<Integer> minHeap = new PriorityQueue<>(n); log.debug("Создаем минимальную кучу с емкостью: {}", n); try (FileInputStream fis = new FileInputStream(file); Workbook workbook = WorkbookFactory.create(fis)) { Sheet sheet = workbook.getSheetAt(0); for (Row row : sheet) { Cell cell = row.getCell(0); if (cell != null && cell.getCellType() == CellType.NUMERIC) { int value = (int) cell.getNumericCellValue(); if (minHeap.size() < n) { minHeap.offer(value); log.debug("Добавили число {} в кучу", value); } else if (value > minHeap.peek()) { Integer minElement = minHeap.poll(); log.debug("Удалили элемент со значением {}", minElement); minHeap.offer(value); log.debug("Добавляем значение {}", value); } } } } if (minHeap.size() < n) { log.debug("В куче находится меньше {} элементов", n); throw new IllegalStateException("В файле меньше " + n + " чисел."); } Integer nthMax = minHeap.peek(); if (nthMax == null) { throw new IllegalStateException("Ошибка при извлечении N-го максимального числа."); } log.info("{}-е максимальное число равно {}", n, nthMax); return nthMax; } }