Возвращает массив целых чисел со значениями, превышающими пороговое значение

Мне нужно добавить в int[] значения, превышающие определенный порог. У меня это не работает, потому что возвращает неправильные значения. Например: «Вывод для значений выше 78: [85, 93, 81, 79, 81, 93]», но я получаю [93, 93, 93, 93, 93, 93]. Почему это так? Спасибо.

public int[] getValuesAboveThreshold(int threshold) {

        // Output for values above 78: [85, 93, 81, 79, 81, 93]

        int[] a = new int[] { 58, 78, 61, 72, 93, 81, 79, 78, 75, 81, 93 };

        int temp[] = new int[1];

        for (int d : a) {

            if (d > threshold) {

                System.out.println(d);

                temp = new int[temp.length + 1];

                for (int i = 0; i < temp.length; i++) {

                    temp[i] = d;

                }

            }

        }

        return temp;

    }

Пожалуйста, объясните внутренний цикл for.

Scott Hunter 10.11.2022 20:09

Ну посмотрите, у нас только что был очень похожий вопрос

Rogue 10.11.2022 20:11

В вашей логике есть одна важная проблема: вы заменяете свой старый int[] temp новым массивом (предположительно, чтобы добавить новое значение), но затем перезаписываете каждую запись одним и тем же значением d. Вероятно, вы хотели вызвать System#arrayCopy (или использовать этот цикл), чтобы сначала переместить старые данные в новый массив, прежде чем присваивать temp.

Rogue 10.11.2022 20:13
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
3
98
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Поскольку вы инициализируете временный массив, по умолчанию для него используется значение по умолчанию int, а когда вы зацикливаете его для добавления значений, он добавляет «d» ко всем индексам. Вместо этого попробуйте ArrayList:

           int[] a = new int[] { 58, 78, 61, 72, 93, 81, 79, 78, 75, 81, 93 };
            ArrayList<Integer> temp = new ArrayList<Integer>();
            for (int d : a) {
                if (d > 73) {
                    System.out.println(d);             
                        temp.add(d);
                }
            }
            System.out.println(temp);
Ответ принят как подходящий

Вы можете вернуть ArrayList вместо int[]. Попробуйте этот пример кода

public static ArrayList<Integer> getValuesAboveThreshold(int threshold) {

    // Output for values above 78: [85, 93, 81, 79, 81, 93]

    int[] a = new int[] { 58, 78, 61, 72, 93, 81, 79, 78, 75, 81, 93 };

    ArrayList<Integer> temp = new ArrayList<>();

    for (int d : a) {

        if (d > threshold) {

            temp.add(d);

        }

    }

    return temp;

}

Массив — это контейнер данных, занимающий непрерывный блок памяти, который выделяется в соответствии с указанным размером массива при создании нового экземпляра массива.

Массивы не могут увеличиваться или уменьшаться, вам всегда нужно указывать длину массива при создании нового массива (если только вы не указываете содержимое массива в фигурных скобках {A,B,C}, что неявно дает информацию о необходимой емкости).

Чтобы в результате сгенерировать массив, сначала нужно узнать количество элементов, превышающих порог, а затем создать массив, в котором будет храниться результат:

public int[] getValuesAboveThreshold(int[] a, int threshold) {
    
    int count = 0;
    
    for (int i : a) if (i > threshold) count++;
    
    int[] res = new int[count];
    int pos = 0; // position in the resulting array
    
    for (int i : a) if (i > threshold) res[pos++] = i; // assign the element and move the position forward
    
    return res;
}

Та же логика может быть реализована с помощью Stream API в одном операторе:

public int[] getValuesAboveThreshold(int[] a, int threshold) {
    
    return Arrays.stream(a)
        .filter(i -> i > threshold)
        .toArray();
}

Другие вопросы по теме