Вернуть число из списка, ближайшее к systemId

77. Вернуть число из списка, ближайшее к systemId

Условие задачи:
📌 Дан сервис ClosestNumberFinderService. Метод getSystemSecretNumber() загружает список чисел через NumberGenerator и должен вернуть число, ближайшее к systemId.

Если есть несколько подходящих чисел, нужно вернуть число с минимальной разницей до systemId.
Для примера: для List.of(3, 5, 7, 9, 12, 15) и systemId = 10 результат должен быть 9.

Код:

@Service
@RequiredArgsConstructor
public class ClosestNumberFinderService {
    /* Бин подключается из библиотеки. Нам виден только интерфейс
        public interface NumberGenerator {
            List<Integer> loadNumbers();
        }
    */
    private final NumberGenerator generator;

    private Integer systemId = 10;

    public Integer getSystemSecretNumber() {
        List<Integer> numbers = generator.loadNumbers();
        return findClosestNumber(numbers, systemId);
    }

    // Пример для List.of(3, 5, 7, 9, 12, 15) и systemId=10, должно вернуться 9
    private Integer findClosestNumber(List<Integer> numbers, int systemId) {
        Number closestNumber = null;
        //TODO техдолг. Реализовать логику
        return closestNumber;
    }
}

📌 Пример 1:
Вход:
numbers = [3, 5, 7, 9, 12, 15]
systemId = 10

Выход:
9

📌 Пример 2:
Вход:
numbers = [1, 8, 11, 20]
systemId = 10

Выход:
11

📌 Пример 3:
Вход:
numbers = [10, 20, 30]
systemId = 10

Выход:
10

📌 Пример 4:
Вход:
numbers = [-5, 0, 6]
systemId = 4

Выход:
6


Спойлеры к решению

Подсказки
💡 Нужно пройти по списку и для каждого числа посчитать расстояние до systemId.
💡 Удобно хранить текущее лучшее число и минимальную найденную разницу.
💡 closestNumber должен быть типа Integer, а не Number.
💡 Стоит обработать случай пустого списка или null.

Решение
@Service
@RequiredArgsConstructor
public class ClosestNumberFinderService {
    /* Бин подключается из библиотеки. Нам виден только интерфейс
        public interface NumberGenerator {
            List<Integer> loadNumbers();
        }
    */
    private final NumberGenerator generator;

    private Integer systemId = 10;

    public Integer getSystemSecretNumber() {
        List<Integer> numbers = generator.loadNumbers();
        return findClosestNumber(numbers, systemId);
    }

    // Пример для List.of(3, 5, 7, 9, 12, 15) и systemId=10, должно вернуться 9
    private Integer findClosestNumber(List<Integer> numbers, int systemId) {
        if (numbers == null || numbers.isEmpty()) {
            return null;
        }

        Integer closestNumber = numbers.get(0);
        int minDiff = Math.abs(closestNumber - systemId);

        for (Integer number : numbers) {
            int diff = Math.abs(number - systemId);
            if (diff < minDiff) {
                minDiff = diff;
                closestNumber = number;
            }
        }

        return closestNumber;
    }
}

Нужно пройти по списку, посчитать модуль разницы до systemId и вернуть число с минимальной разницей.
В исходном коде ошибка в том, что closestNumber объявлен как Number, хотя метод должен вернуть Integer, и сама логика пока не реализована.