1

Тема: Програма "Зменшення елементів массиву" повертає неіснуюче значення

Клас містить у собі метод який має зменшувати елементи массиву: в перший раз метод має зменшити елемент на 0, в другий раз на 1, третій раз на 2 і так далі. Елементи в массиві які мають значення 0 або меньше метод має пропускати. Коли в массиві вже немає значень більше 0, метод має повернути "-1", але в мому випадку метод продовжує працювати і повертає числа по типу 2147450883. Я не можу зрозуміти чого.
Сам клас є наслідником класу CarouselRun, який зменшує елементи массиву на 1 поки усі значення не будуть рівні 0. Масив ми отримуємо із класу DecrementalCarousel.
Мій код:

package com.epam.rd.autotasks;

public class GradDecrRun extends CarouselRun{
    
    int position = 0;
    int[] arr = GraduallyDecreasingCarousel.carousel;
    int decremental = 0;

    @Override
    public int next() {
        for (int j : arr) {
            if (j > 0) {
                if (position >= arr.length) {
                    position = 0;
                    decremental++;
                }
                while (arr[position] - decremental <= 0) {
                    arr[position] = arr[position] - decremental;
                    position++;
                    if (position >= arr.length) {
                        position = 0;
                        decremental++;
                    }
                }
                arr[position] = arr[position] - decremental;
                return arr[position++];
            }
        }
        return -1;
    }

    @Override
    public boolean isFinished() {
        int sum = 0;
        for (int j : arr) {
            if (j > 0) {
                return false;
            }
        }
        DecrementingCarousel.acces = 1;
        return true;
    }
}

Як виглядає метод main:

public class Main {
    public static void main(String[] args) {
        DecrementingCarousel carousel = new GraduallyDecreasingCarousel(7);

        carousel.addElement(20);
        carousel.addElement(30);
        carousel.addElement(10);

        CarouselRun run = carousel.run();

        System.out.println(run.isFinished()); //false

        System.out.println(run.next()); //20
        System.out.println(run.next()); //30
        System.out.println(run.next()); //10

        System.out.println(">>>>>>>>>>");

        System.out.println(run.next()); //19
        System.out.println(run.next()); //29
        System.out.println(run.next()); //9

        System.out.println(">>>>>>>>>>");

        System.out.println(run.next()); //17
        System.out.println(run.next()); //27
        System.out.println(run.next()); //7

        System.out.println(">>>>>>>>>>");

        System.out.println(run.next()); //14
        System.out.println(run.next()); //24
        System.out.println(run.next()); //4

        System.out.println(">>>>>>>>>>");

        System.out.println(run.next()); //10
        System.out.println(run.next()); //20

        System.out.println(">>>>>>>>>>");

        System.out.println(run.next()); //5
        System.out.println(run.next()); //15

        System.out.println(">>>>>>>>>>");

        System.out.println(run.next()); //9

        System.out.println(">>>>>>>>>>");

        System.out.println(run.next()); //2

        System.out.println(run.isFinished()); //true
        System.out.println(run.next()); //-1
        //На моменті коли метод має повернути -1, повертає 2147450883, або інше подібне число, в різних тестах по різному
    }
}

2

Re: Програма "Зменшення елементів массиву" повертає неіснуюче значення

У мене немає світла, тому не можу запустити код; але бачу, що в next не потрібен цикл по j.

3

Re: Програма "Зменшення елементів массиву" повертає неіснуюче значення

Тоді не можна буде виконати перевірку умови що якесь із чисел більше 0

4

Re: Програма "Зменшення елементів массиву" повертає неіснуюче значення

public int next() {
    if(isFinished())
        return -1;
    ...//далі код без цикла
}
Подякували: Dyus1

5

Re: Програма "Зменшення елементів массиву" повертає неіснуюче значення

Конкретно тут я не бачу особливих проблем; швидше за все щось деінде не так.
Узагалі Integer.MAX_VALUE=2147483647, а через доповняльний код Integer.MAX_VALUE+1 == Integer.MIN_VALUE == -2147483648. Це досить підозріло, що результати в цьому районі. Може, там .run() повертає не ваш GradDecrRun, а якусь оболонку, яка після завершення повертає Integer.MAX_VALUE?

Подякували: Dyus1

6

Re: Програма "Зменшення елементів массиву" повертає неіснуюче значення

Запрацювало
Треба було лише isFinished() вставити в цикл while бо він скоріш за все так і відмінусовував значення елементів массиву поки вони по байткоду не пішли кругом і не дійшли до позитивного значення. Дякую велике.