Найдите данные с заданным значением, и если оно не существует, то найдите последнюю запись в ряду данных с этим значением

#java #spring #algorithm #spring-boot

#java #spring #алгоритм #spring-boot

Вопрос:

У меня есть интересный вопрос, с которым я столкнулся, допустим, у вас есть таблица в вашей базе данных, которая состоит из: месяц, год, процентная ставка.

У вас есть запись для каждого месяца, и пользователь ограничен возможностью вносить только одну запись за месяц, и вы можете просто обновить существующую запись. Теперь мне нужно получить данные по месяцам и годам, и я указал месяц и год в качестве параметра, и оба значения находятся в int.

Предположим, вы должны получить данные за 6 месяцев, и у вас нет записи за этот месяц, тогда вам нужно вернуть данные за 5 месяцев, и если это также не существует, и так далее.

Я пробовал рекурсию, но это также подпадает под исключение переполнения стека.

Вот пример метода, который я написал, пожалуйста, предложите свой:

 private InterestRate getCurrentRateOrLastEntry(int month, int year) {
        int givenMonth = month;
        if(givenMonth <= 0) {
            return null;
        }
        InterestRate cost = InterestRateRepo.findByMonthAndIsDeletedAndYear(month, false, year);
        return (cost == null) ?  getCurrentRateOrLastEntry(givenMonth--, year): cost;
    }
  

Пожалуйста, предложите свои мысли, почему это происходит в бесконечном цикле

Ответ №1:

Вы используете postfix для уменьшения givenMonth при вызове рекурсивного метода. Итак, вы вызываете свой рекурсивный метод getCurrentRateOrLastEntry с неизменным givenMonth значением. Условие завершения if(givenMonth <= 0) никогда не срабатывает. Используйте префикс для уменьшения givenMonth -> --givenMonth .

Комментарии:

1. Привет @Arne, я понял, потратив несколько часов, а затем я нашел так много способов сделать это, и вместо рекурсии я использовал цикл while, просто чтобы избежать тяжелой обработки, LOL. Если это поможет читателям, альтернативный подход, которому я следовал, таков: private InterestRate getCurrentRateOrLastEntry(int month, int year) { InterestRate cost = null; int givenMonth = month; while(cost ==null amp;amp; !(givenMonth <1) amp;amp; !(givenMonth > 12){ cost = find the data from repo givenMonth--; } }